mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 19:55:41 +00:00
[SAMLIB/SAMSRV]
Implement SamCreateUser2InDomain / SamrCreateUser2InDomain (untested) and SamLookupNamesInDomain / SamrLookupNamesInDomain. svn path=/trunk/; revision=57054
This commit is contained in:
parent
63dcafd315
commit
2d7441f3ce
4 changed files with 584 additions and 8 deletions
|
@ -191,6 +191,9 @@ SamCreateAliasInDomain(IN SAM_HANDLE DomainHandle,
|
||||||
TRACE("SamCreateAliasInDomain(%p %p 0x%08x %p %p)\n",
|
TRACE("SamCreateAliasInDomain(%p %p 0x%08x %p %p)\n",
|
||||||
DomainHandle, AccountName, DesiredAccess, AliasHandle, RelativeId);
|
DomainHandle, AccountName, DesiredAccess, AliasHandle, RelativeId);
|
||||||
|
|
||||||
|
*AliasHandle = NULL;
|
||||||
|
*RelativeId = 0;
|
||||||
|
|
||||||
RpcTryExcept
|
RpcTryExcept
|
||||||
{
|
{
|
||||||
Status = SamrCreateAliasInDomain((SAMPR_HANDLE)DomainHandle,
|
Status = SamrCreateAliasInDomain((SAMPR_HANDLE)DomainHandle,
|
||||||
|
@ -222,6 +225,9 @@ SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle,
|
||||||
TRACE("SamCreateGroupInDomain(%p %p 0x%08x %p %p)\n",
|
TRACE("SamCreateGroupInDomain(%p %p 0x%08x %p %p)\n",
|
||||||
DomainHandle, AccountName, DesiredAccess, GroupHandle, RelativeId);
|
DomainHandle, AccountName, DesiredAccess, GroupHandle, RelativeId);
|
||||||
|
|
||||||
|
*GroupHandle = NULL;
|
||||||
|
*RelativeId = 0;
|
||||||
|
|
||||||
RpcTryExcept
|
RpcTryExcept
|
||||||
{
|
{
|
||||||
Status = SamrCreateGroupInDomain((SAMPR_HANDLE)DomainHandle,
|
Status = SamrCreateGroupInDomain((SAMPR_HANDLE)DomainHandle,
|
||||||
|
@ -240,6 +246,46 @@ SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
SamCreateUser2InDomain(IN SAM_HANDLE DomainHandle,
|
||||||
|
IN PUNICODE_STRING AccountName,
|
||||||
|
IN ULONG AccountType,
|
||||||
|
IN ACCESS_MASK DesiredAccess,
|
||||||
|
OUT PSAM_HANDLE UserHandle,
|
||||||
|
OUT PULONG GrantedAccess,
|
||||||
|
OUT PULONG RelativeId)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("SamCreateUser2InDomain(%p %p %lu 0x%08x %p %p %p)\n",
|
||||||
|
DomainHandle, AccountName, AccountType, DesiredAccess,
|
||||||
|
UserHandle, GrantedAccess, RelativeId);
|
||||||
|
|
||||||
|
*UserHandle = NULL;
|
||||||
|
*RelativeId = 0;
|
||||||
|
|
||||||
|
RpcTryExcept
|
||||||
|
{
|
||||||
|
Status = SamrCreateUser2InDomain((SAMPR_HANDLE)DomainHandle,
|
||||||
|
(PRPC_UNICODE_STRING)AccountName,
|
||||||
|
AccountType,
|
||||||
|
DesiredAccess,
|
||||||
|
(SAMPR_HANDLE *)UserHandle,
|
||||||
|
GrantedAccess,
|
||||||
|
RelativeId);
|
||||||
|
|
||||||
|
}
|
||||||
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||||
|
}
|
||||||
|
RpcEndExcept;
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamCreateUserInDomain(IN SAM_HANDLE DomainHandle,
|
SamCreateUserInDomain(IN SAM_HANDLE DomainHandle,
|
||||||
|
@ -253,6 +299,9 @@ SamCreateUserInDomain(IN SAM_HANDLE DomainHandle,
|
||||||
TRACE("SamCreateUserInDomain(%p %p 0x%08x %p %p)\n",
|
TRACE("SamCreateUserInDomain(%p %p 0x%08x %p %p)\n",
|
||||||
DomainHandle, AccountName, DesiredAccess, UserHandle, RelativeId);
|
DomainHandle, AccountName, DesiredAccess, UserHandle, RelativeId);
|
||||||
|
|
||||||
|
*UserHandle = NULL;
|
||||||
|
*RelativeId = 0;
|
||||||
|
|
||||||
RpcTryExcept
|
RpcTryExcept
|
||||||
{
|
{
|
||||||
Status = SamrCreateUserInDomain((SAMPR_HANDLE)DomainHandle,
|
Status = SamrCreateUserInDomain((SAMPR_HANDLE)DomainHandle,
|
||||||
|
@ -605,8 +654,75 @@ SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle,
|
||||||
OUT PULONG *RelativeIds,
|
OUT PULONG *RelativeIds,
|
||||||
OUT PSID_NAME_USE *Use)
|
OUT PSID_NAME_USE *Use)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
SAMPR_ULONG_ARRAY RidBuffer = {0, NULL};
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
SAMPR_ULONG_ARRAY UseBuffer = {0, NULL};
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("SamLookupNamesInDomain(%p %lu %p %p %p)\n",
|
||||||
|
DomainHandle, Count, Names, RelativeIds, Use);
|
||||||
|
|
||||||
|
*RelativeIds = NULL;
|
||||||
|
*Use = NULL;
|
||||||
|
|
||||||
|
RidBuffer.Element = NULL;
|
||||||
|
UseBuffer.Element = NULL;
|
||||||
|
|
||||||
|
RpcTryExcept
|
||||||
|
{
|
||||||
|
Status = SamrLookupNamesInDomain((SAMPR_HANDLE)DomainHandle,
|
||||||
|
Count,
|
||||||
|
(PRPC_UNICODE_STRING)Names,
|
||||||
|
&RidBuffer,
|
||||||
|
&UseBuffer);
|
||||||
|
}
|
||||||
|
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
|
||||||
|
{
|
||||||
|
Status = I_RpcMapWin32Status(RpcExceptionCode());
|
||||||
|
}
|
||||||
|
RpcEndExcept;
|
||||||
|
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
*RelativeIds = midl_user_allocate(Count * sizeof(ULONG));
|
||||||
|
if (*RelativeIds == NULL)
|
||||||
|
{
|
||||||
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
*Use = midl_user_allocate(Count * sizeof(SID_NAME_USE));
|
||||||
|
if (*Use == NULL)
|
||||||
|
{
|
||||||
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlCopyMemory(*RelativeIds,
|
||||||
|
RidBuffer.Element,
|
||||||
|
Count * sizeof(ULONG));
|
||||||
|
|
||||||
|
RtlCopyMemory(*Use,
|
||||||
|
UseBuffer.Element,
|
||||||
|
Count * sizeof(SID_NAME_USE));
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
if (*RelativeIds != NULL)
|
||||||
|
midl_user_free(*RelativeIds);
|
||||||
|
|
||||||
|
if (*Use != NULL)
|
||||||
|
midl_user_free(*Use);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RidBuffer.Element != NULL)
|
||||||
|
midl_user_free(RidBuffer.Element);
|
||||||
|
|
||||||
|
if (UseBuffer.Element != NULL)
|
||||||
|
midl_user_free(UseBuffer.Element);
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
@ stub SamConnectWithCreds
|
@ stub SamConnectWithCreds
|
||||||
@ stdcall SamCreateAliasInDomain(ptr ptr long ptr ptr)
|
@ stdcall SamCreateAliasInDomain(ptr ptr long ptr ptr)
|
||||||
@ stdcall SamCreateGroupInDomain(ptr ptr long ptr ptr)
|
@ stdcall SamCreateGroupInDomain(ptr ptr long ptr ptr)
|
||||||
@ stub SamCreateUser2InDomain
|
@ stdcall SamCreateUser2InDomain(ptr ptr long long ptr ptr ptr)
|
||||||
@ stdcall SamCreateUserInDomain(ptr ptr long ptr ptr)
|
@ stdcall SamCreateUserInDomain(ptr ptr long ptr ptr)
|
||||||
@ stub SamDeleteAlias
|
@ stub SamDeleteAlias
|
||||||
@ stub SamDeleteGroup
|
@ stub SamDeleteGroup
|
||||||
|
|
|
@ -2840,15 +2840,212 @@ done:
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle,
|
SamrLookupNamesInDomain(IN SAMPR_HANDLE DomainHandle,
|
||||||
IN unsigned long Count,
|
IN ULONG Count,
|
||||||
IN RPC_UNICODE_STRING Names[],
|
IN RPC_UNICODE_STRING Names[],
|
||||||
OUT PSAMPR_ULONG_ARRAY RelativeIds,
|
OUT PSAMPR_ULONG_ARRAY RelativeIds,
|
||||||
OUT PSAMPR_ULONG_ARRAY Use)
|
OUT PSAMPR_ULONG_ARRAY Use)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PSAM_DB_OBJECT DomainObject;
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
HANDLE AccountsKeyHandle;
|
||||||
|
HANDLE NamesKeyHandle;
|
||||||
|
ULONG MappedCount = 0;
|
||||||
|
ULONG DataLength;
|
||||||
|
ULONG i;
|
||||||
|
ULONG RelativeId;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("SamrLookupNamesInDomain(%p %lu %p %p %p)\n",
|
||||||
|
DomainHandle, Count, Names, RelativeIds, Use);
|
||||||
|
|
||||||
|
/* Validate the domain handle */
|
||||||
|
Status = SampValidateDbObject(DomainHandle,
|
||||||
|
SamDbDomainObject,
|
||||||
|
DOMAIN_LOOKUP,
|
||||||
|
&DomainObject);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RelativeIds->Count = 0;
|
||||||
|
Use->Count = 0;
|
||||||
|
|
||||||
|
if (Count == 0)
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
|
/* Allocate the relative IDs array */
|
||||||
|
RelativeIds->Element = midl_user_allocate(Count * sizeof(ULONG));
|
||||||
|
if (RelativeIds->Element == NULL)
|
||||||
|
{
|
||||||
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate the use array */
|
||||||
|
Use->Element = midl_user_allocate(Count * sizeof(ULONG));
|
||||||
|
if (Use->Element == NULL)
|
||||||
|
{
|
||||||
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
RelativeIds->Count = Count;
|
||||||
|
Use->Count = Count;
|
||||||
|
|
||||||
|
for (i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
TRACE("Name: %S\n", Names[i].Buffer);
|
||||||
|
|
||||||
|
RelativeId = 0;
|
||||||
|
|
||||||
|
/* Lookup aliases */
|
||||||
|
Status = SampRegOpenKey(DomainObject->KeyHandle,
|
||||||
|
L"Aliases",
|
||||||
|
KEY_READ,
|
||||||
|
&AccountsKeyHandle);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
Status = SampRegOpenKey(AccountsKeyHandle,
|
||||||
|
L"Names",
|
||||||
|
KEY_READ,
|
||||||
|
&NamesKeyHandle);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DataLength = sizeof(ULONG);
|
||||||
|
Status = SampRegQueryValue(NamesKeyHandle,
|
||||||
|
Names[i].Buffer,
|
||||||
|
NULL,
|
||||||
|
&RelativeId,
|
||||||
|
&DataLength);
|
||||||
|
|
||||||
|
SampRegCloseKey(NamesKeyHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
SampRegCloseKey(AccountsKeyHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return alias account */
|
||||||
|
if (NT_SUCCESS(Status) && RelativeId != 0)
|
||||||
|
{
|
||||||
|
TRACE("Rid: %lu\n", RelativeId);
|
||||||
|
RelativeIds->Element[i] = RelativeId;
|
||||||
|
Use->Element[i] = SidTypeAlias;
|
||||||
|
MappedCount++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Lookup groups */
|
||||||
|
Status = SampRegOpenKey(DomainObject->KeyHandle,
|
||||||
|
L"Groups",
|
||||||
|
KEY_READ,
|
||||||
|
&AccountsKeyHandle);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
Status = SampRegOpenKey(AccountsKeyHandle,
|
||||||
|
L"Names",
|
||||||
|
KEY_READ,
|
||||||
|
&NamesKeyHandle);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DataLength = sizeof(ULONG);
|
||||||
|
Status = SampRegQueryValue(NamesKeyHandle,
|
||||||
|
Names[i].Buffer,
|
||||||
|
NULL,
|
||||||
|
&RelativeId,
|
||||||
|
&DataLength);
|
||||||
|
|
||||||
|
SampRegCloseKey(NamesKeyHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
SampRegCloseKey(AccountsKeyHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return group account */
|
||||||
|
if (NT_SUCCESS(Status) && RelativeId != 0)
|
||||||
|
{
|
||||||
|
TRACE("Rid: %lu\n", RelativeId);
|
||||||
|
RelativeIds->Element[i] = RelativeId;
|
||||||
|
Use->Element[i] = SidTypeGroup;
|
||||||
|
MappedCount++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Lookup users */
|
||||||
|
Status = SampRegOpenKey(DomainObject->KeyHandle,
|
||||||
|
L"Users",
|
||||||
|
KEY_READ,
|
||||||
|
&AccountsKeyHandle);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
Status = SampRegOpenKey(AccountsKeyHandle,
|
||||||
|
L"Names",
|
||||||
|
KEY_READ,
|
||||||
|
&NamesKeyHandle);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DataLength = sizeof(ULONG);
|
||||||
|
Status = SampRegQueryValue(NamesKeyHandle,
|
||||||
|
Names[i].Buffer,
|
||||||
|
NULL,
|
||||||
|
&RelativeId,
|
||||||
|
&DataLength);
|
||||||
|
|
||||||
|
SampRegCloseKey(NamesKeyHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
SampRegCloseKey(AccountsKeyHandle);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return user account */
|
||||||
|
if (NT_SUCCESS(Status) && RelativeId != 0)
|
||||||
|
{
|
||||||
|
TRACE("Rid: %lu\n", RelativeId);
|
||||||
|
RelativeIds->Element[i] = RelativeId;
|
||||||
|
Use->Element[i] = SidTypeUser;
|
||||||
|
MappedCount++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return unknown account */
|
||||||
|
RelativeIds->Element[i] = 0;
|
||||||
|
Use->Element[i] = SidTypeUnknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
if (MappedCount == 0)
|
||||||
|
Status = STATUS_NONE_MAPPED;
|
||||||
|
else if (MappedCount < Count)
|
||||||
|
Status = STATUS_SOME_NOT_MAPPED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (RelativeIds->Element != NULL)
|
||||||
|
{
|
||||||
|
midl_user_free(RelativeIds->Element);
|
||||||
|
RelativeIds->Element = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
RelativeIds->Count = 0;
|
||||||
|
|
||||||
|
if (Use->Element != NULL)
|
||||||
|
{
|
||||||
|
midl_user_free(Use->Element);
|
||||||
|
Use->Element = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Use->Count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Function 18 */
|
/* Function 18 */
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
|
@ -5546,6 +5743,7 @@ SamrGetDisplayEnumerationIndex2(IN SAMPR_HANDLE DomainHandle,
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Function 50 */
|
/* Function 50 */
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
|
@ -5557,8 +5755,260 @@ SamrCreateUser2InDomain(IN SAMPR_HANDLE DomainHandle,
|
||||||
OUT unsigned long *GrantedAccess,
|
OUT unsigned long *GrantedAccess,
|
||||||
OUT unsigned long *RelativeId)
|
OUT unsigned long *RelativeId)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
UNICODE_STRING EmptyString = RTL_CONSTANT_STRING(L"");
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
SAM_DOMAIN_FIXED_DATA FixedDomainData;
|
||||||
|
SAM_USER_FIXED_DATA FixedUserData;
|
||||||
|
PSAM_DB_OBJECT DomainObject;
|
||||||
|
PSAM_DB_OBJECT UserObject;
|
||||||
|
ULONG ulSize;
|
||||||
|
ULONG ulRid;
|
||||||
|
WCHAR szRid[9];
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
TRACE("SamrCreateUserInDomain(%p %p %lx %p %p)\n",
|
||||||
|
DomainHandle, Name, DesiredAccess, UserHandle, RelativeId);
|
||||||
|
|
||||||
|
if (Name == NULL ||
|
||||||
|
Name->Length == 0 ||
|
||||||
|
Name->Buffer == NULL ||
|
||||||
|
UserHandle == NULL ||
|
||||||
|
RelativeId == NULL)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
/* Check for valid account type */
|
||||||
|
if (AccountType != USER_NORMAL_ACCOUNT &&
|
||||||
|
AccountType != USER_WORKSTATION_TRUST_ACCOUNT &&
|
||||||
|
AccountType != USER_INTERDOMAIN_TRUST_ACCOUNT &&
|
||||||
|
AccountType != USER_SERVER_TRUST_ACCOUNT &&
|
||||||
|
AccountType != USER_TEMP_DUPLICATE_ACCOUNT)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
/* Validate the domain handle */
|
||||||
|
Status = SampValidateDbObject(DomainHandle,
|
||||||
|
SamDbDomainObject,
|
||||||
|
DOMAIN_CREATE_USER,
|
||||||
|
&DomainObject);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if the user name already exists in the domain */
|
||||||
|
Status = SampCheckAccountNameInDomain(DomainObject,
|
||||||
|
Name->Buffer);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("User name \'%S\' already exists in domain (Status 0x%08lx)\n",
|
||||||
|
Name->Buffer, Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the fixed domain attributes */
|
||||||
|
ulSize = sizeof(SAM_DOMAIN_FIXED_DATA);
|
||||||
|
Status = SampGetObjectAttribute(DomainObject,
|
||||||
|
L"F",
|
||||||
|
NULL,
|
||||||
|
(PVOID)&FixedDomainData,
|
||||||
|
&ulSize);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Increment the NextRid attribute */
|
||||||
|
ulRid = FixedDomainData.NextRid;
|
||||||
|
FixedDomainData.NextRid++;
|
||||||
|
|
||||||
|
/* Store the fixed domain attributes */
|
||||||
|
Status = SampSetObjectAttribute(DomainObject,
|
||||||
|
L"F",
|
||||||
|
REG_BINARY,
|
||||||
|
&FixedDomainData,
|
||||||
|
ulSize);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("RID: %lx\n", ulRid);
|
||||||
|
|
||||||
|
/* Convert the RID into a string (hex) */
|
||||||
|
swprintf(szRid, L"%08lX", ulRid);
|
||||||
|
|
||||||
|
/* Create the user object */
|
||||||
|
Status = SampCreateDbObject(DomainObject,
|
||||||
|
L"Users",
|
||||||
|
szRid,
|
||||||
|
SamDbUserObject,
|
||||||
|
DesiredAccess,
|
||||||
|
&UserObject);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add the account name for the user object */
|
||||||
|
Status = SampSetAccountNameInDomain(DomainObject,
|
||||||
|
L"Users",
|
||||||
|
Name->Buffer,
|
||||||
|
ulRid);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize fixed user data */
|
||||||
|
memset(&FixedUserData, 0, sizeof(SAM_USER_FIXED_DATA));
|
||||||
|
FixedUserData.Version = 1;
|
||||||
|
FixedUserData.LastLogon.QuadPart = 0;
|
||||||
|
FixedUserData.LastLogoff.QuadPart = 0;
|
||||||
|
FixedUserData.PasswordLastSet.QuadPart = 0;
|
||||||
|
FixedUserData.AccountExpires.LowPart = MAXULONG;
|
||||||
|
FixedUserData.AccountExpires.HighPart = MAXLONG;
|
||||||
|
FixedUserData.LastBadPasswordTime.QuadPart = 0;
|
||||||
|
FixedUserData.UserId = ulRid;
|
||||||
|
FixedUserData.PrimaryGroupId = DOMAIN_GROUP_RID_USERS;
|
||||||
|
FixedUserData.UserAccountControl = USER_ACCOUNT_DISABLED |
|
||||||
|
USER_PASSWORD_NOT_REQUIRED |
|
||||||
|
AccountType;
|
||||||
|
|
||||||
|
/* Set fixed user data attribute */
|
||||||
|
Status = SampSetObjectAttribute(UserObject,
|
||||||
|
L"F",
|
||||||
|
REG_BINARY,
|
||||||
|
(LPVOID)&FixedUserData,
|
||||||
|
sizeof(SAM_USER_FIXED_DATA));
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the Name attribute */
|
||||||
|
Status = SampSetObjectAttribute(UserObject,
|
||||||
|
L"Name",
|
||||||
|
REG_SZ,
|
||||||
|
(LPVOID)Name->Buffer,
|
||||||
|
Name->MaximumLength);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the FullName attribute */
|
||||||
|
Status = SampSetObjectAttribute(UserObject,
|
||||||
|
L"FullName",
|
||||||
|
REG_SZ,
|
||||||
|
EmptyString.Buffer,
|
||||||
|
EmptyString.MaximumLength);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the HomeDirectory attribute */
|
||||||
|
Status = SampSetObjectAttribute(UserObject,
|
||||||
|
L"HomeDirectory",
|
||||||
|
REG_SZ,
|
||||||
|
EmptyString.Buffer,
|
||||||
|
EmptyString.MaximumLength);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the HomeDirectoryDrive attribute */
|
||||||
|
Status = SampSetObjectAttribute(UserObject,
|
||||||
|
L"HomeDirectoryDrive",
|
||||||
|
REG_SZ,
|
||||||
|
EmptyString.Buffer,
|
||||||
|
EmptyString.MaximumLength);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the ScriptPath attribute */
|
||||||
|
Status = SampSetObjectAttribute(UserObject,
|
||||||
|
L"ScriptPath",
|
||||||
|
REG_SZ,
|
||||||
|
EmptyString.Buffer,
|
||||||
|
EmptyString.MaximumLength);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the ProfilePath attribute */
|
||||||
|
Status = SampSetObjectAttribute(UserObject,
|
||||||
|
L"ProfilePath",
|
||||||
|
REG_SZ,
|
||||||
|
EmptyString.Buffer,
|
||||||
|
EmptyString.MaximumLength);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the AdminComment attribute */
|
||||||
|
Status = SampSetObjectAttribute(UserObject,
|
||||||
|
L"AdminComment",
|
||||||
|
REG_SZ,
|
||||||
|
EmptyString.Buffer,
|
||||||
|
EmptyString.MaximumLength);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the UserComment attribute */
|
||||||
|
Status = SampSetObjectAttribute(UserObject,
|
||||||
|
L"UserComment",
|
||||||
|
REG_SZ,
|
||||||
|
EmptyString.Buffer,
|
||||||
|
EmptyString.MaximumLength);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the WorkStations attribute */
|
||||||
|
Status = SampSetObjectAttribute(UserObject,
|
||||||
|
L"WorkStations",
|
||||||
|
REG_SZ,
|
||||||
|
EmptyString.Buffer,
|
||||||
|
EmptyString.MaximumLength);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
TRACE("failed with status 0x%08lx\n", Status);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: Set default user attributes */
|
||||||
|
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
*UserHandle = (SAMPR_HANDLE)UserObject;
|
||||||
|
*RelativeId = ulRid;
|
||||||
|
*GrantedAccess = UserObject->Access;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("returns with status 0x%08lx\n", Status);
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function 51 */
|
/* Function 51 */
|
||||||
|
|
|
@ -349,6 +349,16 @@ SamCreateGroupInDomain(IN SAM_HANDLE DomainHandle,
|
||||||
OUT PSAM_HANDLE GroupHandle,
|
OUT PSAM_HANDLE GroupHandle,
|
||||||
OUT PULONG RelativeId);
|
OUT PULONG RelativeId);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
SamCreateUser2InDomain(IN SAM_HANDLE DomainHandle,
|
||||||
|
IN PUNICODE_STRING AccountName,
|
||||||
|
IN ULONG AccountType,
|
||||||
|
IN ACCESS_MASK DesiredAccess,
|
||||||
|
OUT PSAM_HANDLE UserHandle,
|
||||||
|
OUT PULONG GrantedAccess,
|
||||||
|
OUT PULONG RelativeId);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
SamCreateUserInDomain(IN SAM_HANDLE DomainHandle,
|
SamCreateUserInDomain(IN SAM_HANDLE DomainHandle,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue