Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: NetAPI DLL * FILE: reactos/dll/win32/netapi32/utils.c * PURPOSE: Helper functions * * PROGRAMMERS: Eric Kohl */
/* INCLUDES ******************************************************************/
#include "netapi32.h"
WINE_DEFAULT_DEBUG_CHANNEL(netapi32);
/* GLOBALS *******************************************************************/
static SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY};
/* FUNCTIONS *****************************************************************/
NTSTATUSGetAccountDomainSid(IN PUNICODE_STRING ServerName, OUT PSID *AccountDomainSid){ PPOLICY_ACCOUNT_DOMAIN_INFO AccountDomainInfo = NULL; LSA_OBJECT_ATTRIBUTES ObjectAttributes; LSA_HANDLE PolicyHandle = NULL; ULONG Length = 0; NTSTATUS Status;
memset(&ObjectAttributes, 0, sizeof(LSA_OBJECT_ATTRIBUTES));
Status = LsaOpenPolicy(ServerName, &ObjectAttributes, POLICY_VIEW_LOCAL_INFORMATION, &PolicyHandle); if (!NT_SUCCESS(Status)) { ERR("LsaOpenPolicy failed (Status %08lx)\n", Status); return Status; }
Status = LsaQueryInformationPolicy(PolicyHandle, PolicyAccountDomainInformation, (PVOID *)&AccountDomainInfo); if (!NT_SUCCESS(Status)) { ERR("LsaQueryInformationPolicy failed (Status %08lx)\n", Status); goto done; }
Length = RtlLengthSid(AccountDomainInfo->DomainSid);
*AccountDomainSid = RtlAllocateHeap(RtlGetProcessHeap(), 0, Length); if (*AccountDomainSid == NULL) { ERR("Failed to allocate SID\n"); Status = STATUS_INSUFFICIENT_RESOURCES; goto done; }
memcpy(*AccountDomainSid, AccountDomainInfo->DomainSid, Length);
done: if (AccountDomainInfo != NULL) LsaFreeMemory(AccountDomainInfo);
LsaClose(PolicyHandle);
return Status;}
NTSTATUSGetBuiltinDomainSid(OUT PSID *BuiltinDomainSid){ PSID Sid = NULL; PULONG Ptr; NTSTATUS Status = STATUS_SUCCESS;
*BuiltinDomainSid = NULL;
Sid = RtlAllocateHeap(RtlGetProcessHeap(), 0, RtlLengthRequiredSid(1)); if (Sid == NULL) return STATUS_INSUFFICIENT_RESOURCES;
Status = RtlInitializeSid(Sid, &NtAuthority, 1); if (!NT_SUCCESS(Status)) goto done;
Ptr = RtlSubAuthoritySid(Sid, 0); *Ptr = SECURITY_BUILTIN_DOMAIN_RID;
*BuiltinDomainSid = Sid;
done: if (!NT_SUCCESS(Status)) { if (Sid != NULL) RtlFreeHeap(RtlGetProcessHeap(), 0, Sid); }
return Status;}
NTSTATUSOpenAccountDomain(IN SAM_HANDLE ServerHandle, IN PUNICODE_STRING ServerName, IN ULONG DesiredAccess, OUT PSAM_HANDLE DomainHandle){ PSID DomainSid = NULL; NTSTATUS Status;
Status = GetAccountDomainSid(ServerName, &DomainSid); if (!NT_SUCCESS(Status)) { ERR("GetAccountDomainSid failed (Status %08lx)\n", Status); return Status; }
Status = SamOpenDomain(ServerHandle, DesiredAccess, DomainSid, DomainHandle);
RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
if (!NT_SUCCESS(Status)) { ERR("SamOpenDomain failed (Status %08lx)\n", Status); }
return Status;}
NTSTATUSOpenBuiltinDomain(IN SAM_HANDLE ServerHandle, IN ULONG DesiredAccess, OUT PSAM_HANDLE DomainHandle){ PSID DomainSid = NULL; NTSTATUS Status;
Status = GetBuiltinDomainSid(&DomainSid); if (!NT_SUCCESS(Status)) { ERR("GetBuiltinDomainSid failed (Status %08lx)\n", Status); return Status; }
Status = SamOpenDomain(ServerHandle, DesiredAccess, DomainSid, DomainHandle);
RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid);
if (!NT_SUCCESS(Status)) { ERR("SamOpenDomain failed (Status %08lx)\n", Status); }
return Status;}
NET_API_STATUSBuildSidFromSidAndRid(IN PSID SrcSid, IN ULONG RelativeId, OUT PSID *DestSid){ UCHAR RidCount; PSID DstSid; ULONG i; ULONG DstSidSize; PULONG p, q; NET_API_STATUS ApiStatus = NERR_Success;
RidCount = *RtlSubAuthorityCountSid(SrcSid); if (RidCount >= 8) return ERROR_INVALID_PARAMETER;
DstSidSize = RtlLengthRequiredSid(RidCount + 1);
ApiStatus = NetApiBufferAllocate(DstSidSize, &DstSid); if (ApiStatus != NERR_Success) return ApiStatus;
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;
*DestSid = DstSid;
return NERR_Success;}
VOIDCopySidFromSidAndRid( _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 */