SAM_HANDLE ServerHandle;
SAM_HANDLE BuiltinDomainHandle;
SAM_HANDLE AccountDomainHandle;
+ PSID AccountDomainSid;
SAM_ENUMERATE_HANDLE EnumerationContext;
PSAM_RID_ENUMERATION Buffer;
static
NET_API_STATUS
BuildUserInfoBuffer(SAM_HANDLE UserHandle,
+ PSID AccountDomainSid,
DWORD level,
ULONG RelativeId,
LPVOID *Buffer)
if (UserInfo->LogonHours.UnitsPerWeek > 0)
Size += (((ULONG)UserInfo->LogonHours.UnitsPerWeek) + 7) / 8;
- /* FIXME: usri4_user_sid */
+ Size += RtlLengthSid(AccountDomainSid) + sizeof(ULONG);
break;
case 10:
UserInfo->FullName.Length + sizeof(WCHAR) +
UserInfo->AdminComment.Length + sizeof(WCHAR);
- /* FIXME: usri23_user_sid */
+ Size += RtlLengthSid(AccountDomainSid) + sizeof(ULONG);
break;
default:
UserInfo4->usri4_country_code = UserInfo->CountryCode;
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;
UserInfo23->usri23_flags = GetAccountFlags(UserInfo->UserAccountControl,
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;
}
goto done;
}
- Status = OpenAccountDomain(EnumContext->ServerHandle,
- (servername != NULL) ? &ServerName : NULL,
- DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP,
- &EnumContext->AccountDomainHandle);
+ /* Get the Account Domain SID */
+ Status = GetAccountDomainSid((servername != NULL) ? &ServerName : NULL,
+ &EnumContext->AccountDomainSid);
if (!NT_SUCCESS(Status))
{
- ERR("OpenAccountDomain failed (Status %08lx)\n", 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,
+ EnumContext->AccountDomainSid,
+ &EnumContext->AccountDomainHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("SamOpenDomain failed (Status %08lx)\n", Status);
ApiStatus = NetpNtStatusToApiStatus(Status);
goto done;
}
}
ApiStatus = BuildUserInfoBuffer(UserHandle,
+ EnumContext->AccountDomainSid,
level,
CurrentUser->RelativeId,
&Buffer);
if (EnumContext->AccountDomainHandle != NULL)
SamCloseHandle(EnumContext->AccountDomainHandle);
+ if (EnumContext->AccountDomainSid != NULL)
+ RtlFreeHeap(RtlGetProcessHeap(), 0, EnumContext->AccountDomainSid);
+
if (EnumContext->ServerHandle != NULL)
SamCloseHandle(EnumContext->ServerHandle);
PULONG RelativeIds = NULL;
PSID_NAME_USE Use = NULL;
LPVOID Buffer = NULL;
+ PSID AccountDomainSid = NULL;
NET_API_STATUS ApiStatus = NERR_Success;
NTSTATUS Status = STATUS_SUCCESS;
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 */
- Status = OpenAccountDomain(ServerHandle,
- (servername != NULL) ? &ServerName : NULL,
- DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP,
- &AccountDomainHandle);
+ Status = SamOpenDomain(ServerHandle,
+ DOMAIN_LIST_ACCOUNTS | DOMAIN_LOOKUP,
+ AccountDomainSid,
+ &AccountDomainHandle);
if (!NT_SUCCESS(Status))
{
ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
}
ApiStatus = BuildUserInfoBuffer(UserHandle,
+ AccountDomainSid,
level,
RelativeIds[0],
&Buffer);
if (AccountDomainHandle != NULL)
SamCloseHandle(AccountDomainHandle);
+ if (AccountDomainSid != NULL)
+ RtlFreeHeap(RtlGetProcessHeap(), 0, AccountDomainSid);
+
if (ServerHandle != NULL)
SamCloseHandle(ServerHandle);