mirror of
https://github.com/reactos/reactos.git
synced 2025-04-27 00:50:23 +00:00
[NETAPI32] NetUserGetInfo: Build and return the users SID for level 4 and 23.
This commit is contained in:
parent
98b7ecd280
commit
0425d866bf
3 changed files with 85 additions and 13 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue