Add helper functions SampOpenAliasObject, SampOpenGroupObject and SampRemoveUserFromAllGroups.

svn path=/trunk/; revision=58476
This commit is contained in:
Eric Kohl
2013-03-12 20:07:56 +00:00
parent 8fc7b3332f
commit 6b643aa953
5 changed files with 148 additions and 0 deletions
+1
View File
@@ -8,6 +8,7 @@ add_rpc_files(server ${REACTOS_SOURCE_DIR}/include/reactos/idl/sam.idl)
spec2def(samsrv.dll samsrv.spec ADD_IMPORTLIB)
list(APPEND SOURCE
alias.c
database.c
domain.c
group.c
+42
View File
@@ -0,0 +1,42 @@
/*
* PROJECT: Local Security Authority Server DLL
* LICENSE: GPL - See COPYING in the top level directory
* FILE: dll/win32/samsrv/alias.c
* PURPOSE: Alias specific helper functions
* COPYRIGHT: Copyright 2013 Eric Kohl
*/
/* INCLUDES ****************************************************************/
#include "samsrv.h"
WINE_DEFAULT_DEBUG_CHANNEL(samsrv);
/* FUNCTIONS ***************************************************************/
NTSTATUS
SampOpenAliasObject(IN PSAM_DB_OBJECT DomainObject,
IN ULONG AliasId,
IN ACCESS_MASK DesiredAccess,
OUT PSAM_DB_OBJECT *AliasObject)
{
WCHAR szRid[9];
TRACE("(%p %lu %lx %p)\n",
DomainObject, AliasId, DesiredAccess, AliasObject);
/* Convert the RID into a string (hex) */
swprintf(szRid, L"%08lX", AliasId);
/* Create the user object */
return SampOpenDbObject(DomainObject,
L"Aliases",
szRid,
AliasId,
SamDbAliasObject,
DesiredAccess,
AliasObject);
}
/* EOF */
+24
View File
@@ -15,6 +15,30 @@ WINE_DEFAULT_DEBUG_CHANNEL(samsrv);
/* FUNCTIONS ***************************************************************/
NTSTATUS
SampOpenGroupObject(IN PSAM_DB_OBJECT DomainObject,
IN ULONG GroupId,
IN ACCESS_MASK DesiredAccess,
OUT PSAM_DB_OBJECT *GroupObject)
{
WCHAR szRid[9];
TRACE("(%p %lu %lx %p)\n",
DomainObject, GroupId, DesiredAccess, GroupObject);
/* Convert the RID into a string (hex) */
swprintf(szRid, L"%08lX", GroupId);
/* Create the user object */
return SampOpenDbObject(DomainObject,
L"Groups",
szRid,
GroupId,
SamDbGroupObject,
DesiredAccess,
GroupObject);
}
NTSTATUS
SampAddMemberToGroup(IN PSAM_DB_OBJECT GroupObject,
+18
View File
@@ -117,6 +117,15 @@ typedef struct _SAM_USER_FIXED_DATA
extern PGENERIC_MAPPING pServerMapping;
/* alias.c */
NTSTATUS
SampOpenAliasObject(IN PSAM_DB_OBJECT DomainObject,
IN ULONG AliasId,
IN ACCESS_MASK DesiredAccess,
OUT PSAM_DB_OBJECT *AliasObject);
/* database.c */
NTSTATUS
@@ -192,6 +201,12 @@ SampCheckAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
/* group.h */
NTSTATUS
SampOpenGroupObject(IN PSAM_DB_OBJECT DomainObject,
IN ULONG GroupId,
IN ACCESS_MASK DesiredAccess,
OUT PSAM_DB_OBJECT *GroupObject);
NTSTATUS
SampAddMemberToGroup(IN PSAM_DB_OBJECT GroupObject,
IN ULONG MemberId);
@@ -301,6 +316,9 @@ SampSetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject,
IN ULONG GroupId,
IN ULONG GroupAttributes);
NTSTATUS
SampRemoveUserFromAllGroups(IN PSAM_DB_OBJECT UserObject);
NTSTATUS
SampSetUserPassword(IN PSAM_DB_OBJECT UserObject,
IN PENCRYPTED_NT_OWF_PASSWORD NtPassword,
+63
View File
@@ -320,6 +320,69 @@ done:
}
NTSTATUS
SampRemoveUserFromAllGroups(IN PSAM_DB_OBJECT UserObject)
{
PGROUP_MEMBERSHIP GroupsBuffer = NULL;
PSAM_DB_OBJECT GroupObject;
ULONG Length = 0;
ULONG i;
NTSTATUS Status;
SampGetObjectAttribute(UserObject,
L"Groups",
NULL,
NULL,
&Length);
if (Length == 0)
return STATUS_SUCCESS;
GroupsBuffer = midl_user_allocate(Length);
if (GroupsBuffer == NULL)
{
Status = STATUS_INSUFFICIENT_RESOURCES;
goto done;
}
Status = SampGetObjectAttribute(UserObject,
L"Groups",
NULL,
GroupsBuffer,
&Length);
if (!NT_SUCCESS(Status))
goto done;
for (i = 0; i < (Length / sizeof(GROUP_MEMBERSHIP)); i++)
{
Status = SampOpenGroupObject(UserObject->ParentObject,
GroupsBuffer[i].RelativeId,
0,
&GroupObject);
if (!NT_SUCCESS(Status))
{
goto done;
}
Status = SampRemoveMemberFromGroup(GroupObject,
UserObject->RelativeId);
SampCloseDbObject(GroupObject);
if (!NT_SUCCESS(Status))
{
goto done;
}
}
done:
if (GroupsBuffer != NULL)
midl_user_free(GroupsBuffer);
return Status;
}
NTSTATUS
SampSetUserPassword(IN PSAM_DB_OBJECT UserObject,
IN PENCRYPTED_NT_OWF_PASSWORD NtPassword,