[NETAPI32] NetUserGetInfo: Build and return the users SID for level 4 and 23.

This commit is contained in:
Eric Kohl 2019-03-11 22:28:42 +01:00
parent 98b7ecd280
commit 0425d866bf
3 changed files with 85 additions and 13 deletions

View file

@ -58,6 +58,12 @@ BuildSidFromSidAndRid(IN PSID SrcSid,
IN ULONG RelativeId, IN ULONG RelativeId,
OUT PSID *DestSid); OUT PSID *DestSid);
VOID
CopySidFromSidAndRid(
_Out_ PSID DstSid,
_In_ PSID SrcSid,
_In_ ULONG RelativeId);
/* wksta.c */ /* wksta.c */
BOOL BOOL

View file

@ -39,6 +39,7 @@ typedef struct _ENUM_CONTEXT
SAM_HANDLE ServerHandle; SAM_HANDLE ServerHandle;
SAM_HANDLE BuiltinDomainHandle; SAM_HANDLE BuiltinDomainHandle;
SAM_HANDLE AccountDomainHandle; SAM_HANDLE AccountDomainHandle;
PSID AccountDomainSid;
SAM_ENUMERATE_HANDLE EnumerationContext; SAM_ENUMERATE_HANDLE EnumerationContext;
PSAM_RID_ENUMERATION Buffer; PSAM_RID_ENUMERATION Buffer;
@ -400,6 +401,7 @@ FreeUserInfo(PUSER_ALL_INFORMATION UserInfo)
static static
NET_API_STATUS NET_API_STATUS
BuildUserInfoBuffer(SAM_HANDLE UserHandle, BuildUserInfoBuffer(SAM_HANDLE UserHandle,
PSID AccountDomainSid,
DWORD level, DWORD level,
ULONG RelativeId, ULONG RelativeId,
LPVOID *Buffer) LPVOID *Buffer)
@ -508,7 +510,7 @@ BuildUserInfoBuffer(SAM_HANDLE UserHandle,
if (UserInfo->LogonHours.UnitsPerWeek > 0) if (UserInfo->LogonHours.UnitsPerWeek > 0)
Size += (((ULONG)UserInfo->LogonHours.UnitsPerWeek) + 7) / 8; Size += (((ULONG)UserInfo->LogonHours.UnitsPerWeek) + 7) / 8;
/* FIXME: usri4_user_sid */ Size += RtlLengthSid(AccountDomainSid) + sizeof(ULONG);
break; break;
case 10: case 10:
@ -547,7 +549,7 @@ BuildUserInfoBuffer(SAM_HANDLE UserHandle,
UserInfo->FullName.Length + sizeof(WCHAR) + UserInfo->FullName.Length + sizeof(WCHAR) +
UserInfo->AdminComment.Length + sizeof(WCHAR); UserInfo->AdminComment.Length + sizeof(WCHAR);
/* FIXME: usri23_user_sid */ Size += RtlLengthSid(AccountDomainSid) + sizeof(ULONG);
break; break;
default: default:
@ -993,7 +995,9 @@ BuildUserInfoBuffer(SAM_HANDLE UserHandle,
UserInfo4->usri4_country_code = UserInfo->CountryCode; UserInfo4->usri4_country_code = UserInfo->CountryCode;
UserInfo4->usri4_code_page = UserInfo->CodePage; UserInfo4->usri4_code_page = UserInfo->CodePage;
/* FIXME: usri4_user_sid */ UserInfo4->usri4_user_sid = (PVOID)Ptr;
CopySidFromSidAndRid(UserInfo4->usri4_user_sid, AccountDomainSid, RelativeId);
Ptr = (LPWSTR)((ULONG_PTR)Ptr + RtlLengthSid(AccountDomainSid) + sizeof(ULONG));
UserInfo4->usri4_primary_group_id = UserInfo->PrimaryGroupId; UserInfo4->usri4_primary_group_id = UserInfo->PrimaryGroupId;
@ -1216,7 +1220,9 @@ BuildUserInfoBuffer(SAM_HANDLE UserHandle,
UserInfo23->usri23_flags = GetAccountFlags(UserInfo->UserAccountControl, UserInfo23->usri23_flags = GetAccountFlags(UserInfo->UserAccountControl,
Dacl); Dacl);
/* FIXME: usri23_user_sid */ UserInfo23->usri23_user_sid = (PVOID)Ptr;
CopySidFromSidAndRid(UserInfo23->usri23_user_sid, AccountDomainSid, RelativeId);
Ptr = (LPWSTR)((ULONG_PTR)Ptr + RtlLengthSid(AccountDomainSid) + sizeof(ULONG));
break; break;
} }
@ -2484,13 +2490,24 @@ NetUserEnum(LPCWSTR servername,
goto done; goto done;
} }
Status = OpenAccountDomain(EnumContext->ServerHandle, /* Get the Account Domain SID */
(servername != NULL) ? &ServerName : NULL, Status = GetAccountDomainSid((servername != NULL) ? &ServerName : NULL,
&EnumContext->AccountDomainSid);
if (!NT_SUCCESS(Status))
{
ERR("GetAccountDomainSid failed (Status %08lx)\n", Status);
ApiStatus = NetpNtStatusToApiStatus(Status);
goto done;
}
/* Open the Account Domain */
Status = SamOpenDomain(EnumContext->ServerHandle,
DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP, DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP,
EnumContext->AccountDomainSid,
&EnumContext->AccountDomainHandle); &EnumContext->AccountDomainHandle);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
ERR("OpenAccountDomain failed (Status %08lx)\n", Status); ERR("SamOpenDomain failed (Status %08lx)\n", Status);
ApiStatus = NetpNtStatusToApiStatus(Status); ApiStatus = NetpNtStatusToApiStatus(Status);
goto done; goto done;
} }
@ -2567,6 +2584,7 @@ NetUserEnum(LPCWSTR servername,
} }
ApiStatus = BuildUserInfoBuffer(UserHandle, ApiStatus = BuildUserInfoBuffer(UserHandle,
EnumContext->AccountDomainSid,
level, level,
CurrentUser->RelativeId, CurrentUser->RelativeId,
&Buffer); &Buffer);
@ -2601,6 +2619,9 @@ done:
if (EnumContext->AccountDomainHandle != NULL) if (EnumContext->AccountDomainHandle != NULL)
SamCloseHandle(EnumContext->AccountDomainHandle); SamCloseHandle(EnumContext->AccountDomainHandle);
if (EnumContext->AccountDomainSid != NULL)
RtlFreeHeap(RtlGetProcessHeap(), 0, EnumContext->AccountDomainSid);
if (EnumContext->ServerHandle != NULL) if (EnumContext->ServerHandle != NULL)
SamCloseHandle(EnumContext->ServerHandle); SamCloseHandle(EnumContext->ServerHandle);
@ -2816,6 +2837,7 @@ NetUserGetInfo(LPCWSTR servername,
PULONG RelativeIds = NULL; PULONG RelativeIds = NULL;
PSID_NAME_USE Use = NULL; PSID_NAME_USE Use = NULL;
LPVOID Buffer = NULL; LPVOID Buffer = NULL;
PSID AccountDomainSid = NULL;
NET_API_STATUS ApiStatus = NERR_Success; NET_API_STATUS ApiStatus = NERR_Success;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
@ -2839,10 +2861,20 @@ NetUserGetInfo(LPCWSTR servername,
goto done; goto done;
} }
/* Get the Account Domain SID */
Status = GetAccountDomainSid((servername != NULL) ? &ServerName : NULL,
&AccountDomainSid);
if (!NT_SUCCESS(Status))
{
ERR("GetAccountDomainSid failed (Status %08lx)\n", Status);
ApiStatus = NetpNtStatusToApiStatus(Status);
goto done;
}
/* Open the Account Domain */ /* Open the Account Domain */
Status = OpenAccountDomain(ServerHandle, Status = SamOpenDomain(ServerHandle,
(servername != NULL) ? &ServerName : NULL,
DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP, DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP,
AccountDomainSid,
&AccountDomainHandle); &AccountDomainHandle);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
@ -2890,6 +2922,7 @@ NetUserGetInfo(LPCWSTR servername,
} }
ApiStatus = BuildUserInfoBuffer(UserHandle, ApiStatus = BuildUserInfoBuffer(UserHandle,
AccountDomainSid,
level, level,
RelativeIds[0], RelativeIds[0],
&Buffer); &Buffer);
@ -2912,6 +2945,9 @@ done:
if (AccountDomainHandle != NULL) if (AccountDomainHandle != NULL)
SamCloseHandle(AccountDomainHandle); SamCloseHandle(AccountDomainHandle);
if (AccountDomainSid != NULL)
RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid);
if (ServerHandle != NULL) if (ServerHandle != NULL)
SamCloseHandle(ServerHandle); SamCloseHandle(ServerHandle);

View file

@ -215,4 +215,34 @@ BuildSidFromSidAndRid(IN PSID SrcSid,
return NERR_Success; return NERR_Success;
} }
VOID
CopySidFromSidAndRid(
_Out_ PSID DstSid,
_In_ PSID SrcSid,
_In_ ULONG RelativeId)
{
UCHAR RidCount;
ULONG i;
PULONG p, q;
RidCount = *RtlSubAuthorityCountSid(SrcSid);
if (RidCount >= 8)
return;
RtlInitializeSid(DstSid,
RtlIdentifierAuthoritySid(SrcSid),
RidCount + 1);
for (i = 0; i < (ULONG)RidCount; i++)
{
p = RtlSubAuthoritySid(SrcSid, i);
q = RtlSubAuthoritySid(DstSid, i);
*q = *p;
}
q = RtlSubAuthoritySid(DstSid, (ULONG)RidCount);
*q = RelativeId;
}
/* EOF */ /* EOF */