2 * COPYRIGHT: See COPYING in the top level directory
4 * FILE: reactos/dll/win32/netapi32/misc.c
5 * PURPOSE: Helper functions
7 * PROGRAMMERS: Eric Kohl
10 /* INCLUDES ******************************************************************/
15 WINE_DEFAULT_DEBUG_CHANNEL(netapi32
);
18 /* GLOBALS *******************************************************************/
20 static SID_IDENTIFIER_AUTHORITY NtAuthority
= {SECURITY_NT_AUTHORITY
};
23 /* FUNCTIONS *****************************************************************/
26 GetAccountDomainSid(IN PUNICODE_STRING ServerName
,
27 OUT PSID
*AccountDomainSid
)
29 PPOLICY_ACCOUNT_DOMAIN_INFO AccountDomainInfo
= NULL
;
30 LSA_OBJECT_ATTRIBUTES ObjectAttributes
;
31 LSA_HANDLE PolicyHandle
= NULL
;
35 memset(&ObjectAttributes
, 0, sizeof(LSA_OBJECT_ATTRIBUTES
));
37 Status
= LsaOpenPolicy(ServerName
,
39 POLICY_VIEW_LOCAL_INFORMATION
,
41 if (!NT_SUCCESS(Status
))
43 ERR("LsaOpenPolicy failed (Status %08lx)\n", Status
);
47 Status
= LsaQueryInformationPolicy(PolicyHandle
,
48 PolicyAccountDomainInformation
,
49 (PVOID
*)&AccountDomainInfo
);
50 if (!NT_SUCCESS(Status
))
52 ERR("LsaQueryInformationPolicy failed (Status %08lx)\n", Status
);
56 Length
= RtlLengthSid(AccountDomainInfo
->DomainSid
);
58 *AccountDomainSid
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Length
);
59 if (*AccountDomainSid
== NULL
)
61 ERR("Failed to allocate SID\n");
62 Status
= STATUS_INSUFFICIENT_RESOURCES
;
66 memcpy(*AccountDomainSid
, AccountDomainInfo
->DomainSid
, Length
);
69 if (AccountDomainInfo
!= NULL
)
70 LsaFreeMemory(AccountDomainInfo
);
72 LsaClose(PolicyHandle
);
79 GetBuiltinDomainSid(OUT PSID
*BuiltinDomainSid
)
83 NTSTATUS Status
= STATUS_SUCCESS
;
85 *BuiltinDomainSid
= NULL
;
87 Sid
= RtlAllocateHeap(RtlGetProcessHeap(),
89 RtlLengthRequiredSid(1));
91 return STATUS_INSUFFICIENT_RESOURCES
;
93 Status
= RtlInitializeSid(Sid
,
96 if (!NT_SUCCESS(Status
))
99 Ptr
= RtlSubAuthoritySid(Sid
, 0);
100 *Ptr
= SECURITY_BUILTIN_DOMAIN_RID
;
102 *BuiltinDomainSid
= Sid
;
105 if (!NT_SUCCESS(Status
))
108 RtlFreeHeap(RtlGetProcessHeap(), 0, Sid
);
116 OpenAccountDomain(IN SAM_HANDLE ServerHandle
,
117 IN PUNICODE_STRING ServerName
,
118 IN ULONG DesiredAccess
,
119 OUT PSAM_HANDLE DomainHandle
)
121 PSID DomainSid
= NULL
;
124 Status
= GetAccountDomainSid(ServerName
,
126 if (!NT_SUCCESS(Status
))
128 ERR("GetAccountDomainSid failed (Status %08lx)\n", Status
);
132 Status
= SamOpenDomain(ServerHandle
,
137 RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid
);
139 if (!NT_SUCCESS(Status
))
141 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);
149 OpenBuiltinDomain(IN SAM_HANDLE ServerHandle
,
150 IN ULONG DesiredAccess
,
151 OUT PSAM_HANDLE DomainHandle
)
153 PSID DomainSid
= NULL
;
156 Status
= GetBuiltinDomainSid(&DomainSid
);
157 if (!NT_SUCCESS(Status
))
159 ERR("GetBuiltinDomainSid failed (Status %08lx)\n", Status
);
163 Status
= SamOpenDomain(ServerHandle
,
168 RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid
);
170 if (!NT_SUCCESS(Status
))
172 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);