2 * PROJECT: Local Security Authority Server DLL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/samsrv/domain.c
5 * PURPOSE: Domain specific helper functions
6 * COPYRIGHT: Copyright 2013 Eric Kohl
11 /* FUNCTIONS ***************************************************************/
14 SampSetAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject
,
15 IN LPCWSTR lpContainerName
,
16 IN LPCWSTR lpAccountName
,
17 IN ULONG ulRelativeId
)
19 HANDLE ContainerKeyHandle
= NULL
;
20 HANDLE NamesKeyHandle
= NULL
;
23 TRACE("SampSetAccountNameInDomain()\n");
25 /* Open the container key */
26 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
30 if (!NT_SUCCESS(Status
))
33 /* Open the 'Names' key */
34 Status
= SampRegOpenKey(ContainerKeyHandle
,
38 if (!NT_SUCCESS(Status
))
41 /* Set the alias value */
42 Status
= SampRegSetValue(NamesKeyHandle
,
45 (LPVOID
)&ulRelativeId
,
49 SampRegCloseKey(&NamesKeyHandle
);
50 SampRegCloseKey(&ContainerKeyHandle
);
57 SampRemoveAccountNameFromDomain(IN PSAM_DB_OBJECT DomainObject
,
58 IN LPCWSTR lpContainerName
,
59 IN LPCWSTR lpAccountName
)
61 HANDLE ContainerKeyHandle
= NULL
;
62 HANDLE NamesKeyHandle
= NULL
;
65 TRACE("(%S %S)\n", lpContainerName
, lpAccountName
);
67 /* Open the container key */
68 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
72 if (!NT_SUCCESS(Status
))
75 /* Open the 'Names' key */
76 Status
= SampRegOpenKey(ContainerKeyHandle
,
80 if (!NT_SUCCESS(Status
))
83 /* Delete the account name value */
84 Status
= SampRegDeleteValue(NamesKeyHandle
,
88 SampRegCloseKey(&NamesKeyHandle
);
89 SampRegCloseKey(&ContainerKeyHandle
);
96 SampCheckAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject
,
97 IN LPCWSTR lpAccountName
)
99 HANDLE AccountKey
= NULL
;
100 HANDLE NamesKey
= NULL
;
103 TRACE("SampCheckAccountNameInDomain()\n");
105 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
109 if (NT_SUCCESS(Status
))
111 Status
= SampRegOpenKey(AccountKey
,
115 if (NT_SUCCESS(Status
))
117 Status
= SampRegQueryValue(NamesKey
,
122 if (Status
== STATUS_SUCCESS
)
124 SampRegCloseKey(&NamesKey
);
125 Status
= STATUS_ALIAS_EXISTS
;
127 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
128 Status
= STATUS_SUCCESS
;
131 SampRegCloseKey(&AccountKey
);
134 if (!NT_SUCCESS(Status
))
136 TRACE("Checking for alias account failed (Status 0x%08lx)\n", Status
);
140 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
144 if (NT_SUCCESS(Status
))
146 Status
= SampRegOpenKey(AccountKey
,
150 if (NT_SUCCESS(Status
))
152 Status
= SampRegQueryValue(NamesKey
,
157 if (Status
== STATUS_SUCCESS
)
159 SampRegCloseKey(&NamesKey
);
160 Status
= STATUS_ALIAS_EXISTS
;
162 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
163 Status
= STATUS_SUCCESS
;
166 SampRegCloseKey(&AccountKey
);
169 if (!NT_SUCCESS(Status
))
171 TRACE("Checking for group account failed (Status 0x%08lx)\n", Status
);
175 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
179 if (NT_SUCCESS(Status
))
181 Status
= SampRegOpenKey(AccountKey
,
185 if (NT_SUCCESS(Status
))
187 Status
= SampRegQueryValue(NamesKey
,
192 if (Status
== STATUS_SUCCESS
)
194 SampRegCloseKey(&NamesKey
);
195 Status
= STATUS_ALIAS_EXISTS
;
197 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
198 Status
= STATUS_SUCCESS
;
201 SampRegCloseKey(&AccountKey
);
204 if (!NT_SUCCESS(Status
))
206 TRACE("Checking for user account failed (Status 0x%08lx)\n", Status
);
214 SampRemoveMemberFromAllAliases(IN PSAM_DB_OBJECT DomainObject
,
215 IN PRPC_SID MemberSid
)
217 WCHAR AliasKeyName
[64];
218 LPWSTR MemberSidString
= NULL
;
219 HANDLE AliasesKey
= NULL
;
220 HANDLE MembersKey
= NULL
;
221 HANDLE AliasKey
= NULL
;
225 TRACE("(%p %p)\n", DomainObject
, MemberSid
);
227 ConvertSidToStringSidW(MemberSid
, &MemberSidString
);
228 TRACE("Member SID: %S\n", MemberSidString
);
230 Status
= SampRegOpenKey(DomainObject
->KeyHandle
,
234 if (NT_SUCCESS(Status
))
239 Status
= SampRegEnumerateSubKey(AliasesKey
,
243 if (!NT_SUCCESS(Status
))
245 if (Status
== STATUS_NO_MORE_ENTRIES
)
246 Status
= STATUS_SUCCESS
;
250 TRACE("Alias key name: %S\n", AliasKeyName
);
252 Status
= SampRegOpenKey(AliasesKey
,
256 if (NT_SUCCESS(Status
))
258 Status
= SampRegOpenKey(AliasKey
,
262 if (NT_SUCCESS(Status
))
264 Status
= SampRegDeleteValue(AliasKey
,
267 SampRegCloseKey(&MembersKey
);
269 else if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
270 Status
= STATUS_SUCCESS
;
272 SampRegCloseKey(&AliasKey
);
278 Status
= SampRegOpenKey(AliasesKey
,
282 if (NT_SUCCESS(Status
))
284 Status
= SampRegDeleteKey(MembersKey
,
286 if (Status
== STATUS_OBJECT_NAME_NOT_FOUND
)
287 Status
= STATUS_SUCCESS
;
289 SampRegCloseKey(&MembersKey
);
292 SampRegCloseKey(&AliasesKey
);
295 if (MemberSidString
!= NULL
)
296 LocalFree(MemberSidString
);
303 SampCreateAccountSid(IN PSAM_DB_OBJECT DomainObject
,
304 IN ULONG ulRelativeId
,
305 IN OUT PSID
*AccountSid
)
307 PSID DomainSid
= NULL
;
311 Status
= SampGetObjectAttribute(DomainObject
,
316 if (!NT_SUCCESS(Status
) && Status
!= STATUS_BUFFER_OVERFLOW
)
318 TRACE("Status 0x%08lx\n", Status
);
322 TRACE("Length: %lu\n", Length
);
324 DomainSid
= RtlAllocateHeap(RtlGetProcessHeap(), 0, Length
);
325 if (DomainSid
== NULL
)
327 Status
= STATUS_INSUFFICIENT_RESOURCES
;
331 Status
= SampGetObjectAttribute(DomainObject
,
336 if (!NT_SUCCESS(Status
))
338 TRACE("Status 0x%08lx\n", Status
);
342 *AccountSid
= AppendRidToSid(DomainSid
,
346 if (DomainSid
!= NULL
)
347 RtlFreeHeap(RtlGetProcessHeap(), 0, DomainSid
);