ReactOS 0.4.17-dev-357-ga8f14ff
local_group.c
Go to the documentation of this file.
1/*
2 * Copyright 2006 Robert Reif
3 *
4 * netapi32 local group functions
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21#include "netapi32.h"
22
24
25typedef enum _ENUM_PHASE
26{
31
32typedef struct _ENUM_CONTEXT
33{
38
44
46
48{
53
58
60
61
62static
67{
68 LPVOID LocalBuffer = NULL;
69 PLOCALGROUP_INFO_0 LocalInfo0;
70 PLOCALGROUP_INFO_1 LocalInfo1;
71 LPWSTR Ptr;
72 ULONG Size = 0;
73 NET_API_STATUS ApiStatus = NERR_Success;
74
75 *Buffer = NULL;
76
77 switch (level)
78 {
79 case 0:
80 Size = sizeof(LOCALGROUP_INFO_0) +
81 AliasInfo->Name.Length + sizeof(WCHAR);
82 break;
83
84 case 1:
85 Size = sizeof(LOCALGROUP_INFO_1) +
86 AliasInfo->Name.Length + sizeof(WCHAR) +
87 AliasInfo->AdminComment.Length + sizeof(WCHAR);
88 break;
89
90 default:
91 ApiStatus = ERROR_INVALID_LEVEL;
92 goto done;
93 }
94
95 ApiStatus = NetApiBufferAllocate(Size, &LocalBuffer);
96 if (ApiStatus != NERR_Success)
97 goto done;
98
99 ZeroMemory(LocalBuffer, Size);
100
101 switch (level)
102 {
103 case 0:
104 LocalInfo0 = (PLOCALGROUP_INFO_0)LocalBuffer;
105
106 Ptr = (LPWSTR)((ULONG_PTR)LocalInfo0 + sizeof(LOCALGROUP_INFO_0));
107 LocalInfo0->lgrpi0_name = Ptr;
108
109 memcpy(LocalInfo0->lgrpi0_name,
110 AliasInfo->Name.Buffer,
111 AliasInfo->Name.Length);
112 LocalInfo0->lgrpi0_name[AliasInfo->Name.Length / sizeof(WCHAR)] = UNICODE_NULL;
113 break;
114
115 case 1:
116 LocalInfo1 = (PLOCALGROUP_INFO_1)LocalBuffer;
117
118 Ptr = (LPWSTR)((ULONG_PTR)LocalInfo1 + sizeof(LOCALGROUP_INFO_1));
119 LocalInfo1->lgrpi1_name = Ptr;
120
121 memcpy(LocalInfo1->lgrpi1_name,
122 AliasInfo->Name.Buffer,
123 AliasInfo->Name.Length);
124 LocalInfo1->lgrpi1_name[AliasInfo->Name.Length / sizeof(WCHAR)] = UNICODE_NULL;
125
126 Ptr = (LPWSTR)((ULONG_PTR)Ptr + AliasInfo->Name.Length + sizeof(WCHAR));
127 LocalInfo1->lgrpi1_comment = Ptr;
128
129 memcpy(LocalInfo1->lgrpi1_comment,
130 AliasInfo->AdminComment.Buffer,
131 AliasInfo->AdminComment.Length);
132 LocalInfo1->lgrpi1_comment[AliasInfo->AdminComment.Length / sizeof(WCHAR)] = UNICODE_NULL;
133 break;
134 }
135
136done:
137 if (ApiStatus == NERR_Success)
138 {
139 *Buffer = LocalBuffer;
140 }
141 else
142 {
143 if (LocalBuffer != NULL)
144 NetApiBufferFree(LocalBuffer);
145 }
146
147 return ApiStatus;
148}
149
150
151static
152VOID
154{
155 if (AliasInfo->Name.Buffer != NULL)
156 SamFreeMemory(AliasInfo->Name.Buffer);
157
158 if (AliasInfo->AdminComment.Buffer != NULL)
160
161 SamFreeMemory(AliasInfo);
162}
163
164
165static
168 PUNICODE_STRING AliasName,
170 PSAM_HANDLE AliasHandle)
171{
172 PULONG RelativeIds = NULL;
173 PSID_NAME_USE Use = NULL;
174 NET_API_STATUS ApiStatus = NERR_Success;
176
177 /* Get the RID for the given user name */
178 Status = SamLookupNamesInDomain(DomainHandle,
179 1,
180 AliasName,
181 &RelativeIds,
182 &Use);
183 if (!NT_SUCCESS(Status))
184 {
185 ERR("SamLookupNamesInDomain(%wZ) failed (Status %08lx)\n", AliasName, Status);
187 }
188
189 /* Fail, if it is not an alias account */
190 if (Use[0] != SidTypeAlias)
191 {
192 ERR("Object is not an Alias!\n");
193 ApiStatus = NERR_GroupNotFound;
194 goto done;
195 }
196
197 /* Open the alias account */
198 Status = SamOpenAlias(DomainHandle,
200 RelativeIds[0],
201 AliasHandle);
202 if (!NT_SUCCESS(Status))
203 {
204 ERR("SamOpenDomain failed (Status %08lx)\n", Status);
205 ApiStatus = NetpNtStatusToApiStatus(Status);
206 goto done;
207 }
208
209done:
210 if (RelativeIds != NULL)
211 SamFreeMemory(RelativeIds);
212
213 if (Use != NULL)
214 SamFreeMemory(Use);
215
216 return ApiStatus;
217}
218
219
220static
224 IN ULONG EntryCount,
226{
229 PUNICODE_STRING NamesArray = NULL;
230 ULONG i;
233 PLOCALGROUP_MEMBERS_INFO_0 MemberBuffer = NULL;
234 NET_API_STATUS ApiStatus = NERR_Success;
236
237 ApiStatus = NetApiBufferAllocate(sizeof(UNICODE_STRING) * EntryCount,
238 (LPVOID*)&NamesArray);
239 if (ApiStatus != NERR_Success)
240 {
241 goto done;
242 }
243
244 for (i = 0; i < EntryCount; i++)
245 {
246 RtlInitUnicodeString(&NamesArray[i],
247 buf[i].lgrmi3_domainandname);
248 }
249
251 NULL,
252 0,
253 0,
254 NULL);
255
256 Status = LsaOpenPolicy(ServerName,
259 &LsaHandle);
260 if (!NT_SUCCESS(Status))
261 {
262 ApiStatus = NetpNtStatusToApiStatus(Status);
263 goto done;
264 }
265
267 EntryCount,
268 NamesArray,
269 &Domains,
270 &Sids);
271 if (!NT_SUCCESS(Status))
272 {
273 ApiStatus = NetpNtStatusToApiStatus(Status);
274 goto done;
275 }
276
277 ApiStatus = NetApiBufferAllocate(sizeof(LOCALGROUP_MEMBERS_INFO_0) * EntryCount,
278 (LPVOID*)&MemberBuffer);
279 if (ApiStatus != NERR_Success)
280 {
281 goto done;
282 }
283
284 for (i = 0; i < EntryCount; i++)
285 {
286 ApiStatus = BuildSidFromSidAndRid(Domains->Domains[Sids[i].DomainIndex].Sid,
287 Sids[i].RelativeId,
288 &MemberBuffer[i].lgrmi0_sid);
289 if (ApiStatus != NERR_Success)
290 {
291 goto done;
292 }
293 }
294
295done:
296 if (ApiStatus != NERR_Success)
297 {
298 if (MemberBuffer != NULL)
299 {
300 for (i = 0; i < EntryCount; i++)
301 {
302 if (MemberBuffer[i].lgrmi0_sid != NULL)
303 NetApiBufferFree(MemberBuffer[i].lgrmi0_sid);
304 }
305
306 NetApiBufferFree(MemberBuffer);
307 MemberBuffer = NULL;
308 }
309 }
310
311 if (Sids != NULL)
312 LsaFreeMemory(Sids);
313
314 if (Domains != NULL)
315 LsaFreeMemory(Domains);
316
317 if (LsaHandle != NULL)
319
320 if (NamesArray != NULL)
321 NetApiBufferFree(NamesArray);
322
323 *MemberList = MemberBuffer;
324
325 return ApiStatus;
326}
327
328
329/************************************************************
330 * NetLocalGroupAdd (NETAPI32.@)
331 */
333WINAPI
335 LPCWSTR servername,
336 DWORD level,
337 LPBYTE buf,
338 LPDWORD parm_err)
339{
341 UNICODE_STRING ServerName;
342 UNICODE_STRING AliasName;
343 SAM_HANDLE ServerHandle = NULL;
344 SAM_HANDLE DomainHandle = NULL;
345 SAM_HANDLE AliasHandle = NULL;
346 LPWSTR aliasname = NULL;
347 LPWSTR aliascomment = NULL;
348 ULONG RelativeId;
349 NET_API_STATUS ApiStatus = NERR_Success;
351
352 TRACE("(%s %d %p %p) stub!\n", debugstr_w(servername), level, buf,
353 parm_err);
354
355 if (parm_err != NULL)
356 *parm_err = PARM_ERROR_NONE;
357
358 /* Initialize the Server name*/
359 if (servername != NULL)
360 RtlInitUnicodeString(&ServerName, servername);
361
362 /* Initialize the Alias name*/
363 switch (level)
364 {
365 case 0:
366 aliasname = ((PLOCALGROUP_INFO_0)buf)->lgrpi0_name;
367 aliascomment = NULL;
368 break;
369
370 case 1:
371 aliasname = ((PLOCALGROUP_INFO_1)buf)->lgrpi1_name;
372 aliascomment = ((PLOCALGROUP_INFO_1)buf)->lgrpi1_comment;
373 break;
374
375 default:
376 return ERROR_INVALID_LEVEL;
377 }
378
379 RtlInitUnicodeString(&AliasName, aliasname);
380
381 /* Connect to the SAM Server */
382 Status = SamConnect((servername != NULL) ? &ServerName : NULL,
383 &ServerHandle,
385 NULL);
386 if (!NT_SUCCESS(Status))
387 {
388 ERR("SamConnect failed (Status %08lx)\n", Status);
389 ApiStatus = NetpNtStatusToApiStatus(Status);
390 goto done;
391 }
392
393 /* Open the Builtin Domain */
394 Status = OpenBuiltinDomain(ServerHandle,
396 &DomainHandle);
397 if (!NT_SUCCESS(Status))
398 {
399 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status);
400 ApiStatus = NetpNtStatusToApiStatus(Status);
401 goto done;
402 }
403
404 /* Try to open the Alias Account in the Builtin Domain */
405 ApiStatus = OpenAliasByName(DomainHandle,
406 &AliasName,
408 &AliasHandle);
409 if (ApiStatus == NERR_Success)
410 {
411 ERR("OpenAliasByName: alias %wZ already exists!\n", &AliasName);
412
413 SamCloseHandle(AliasHandle);
414 ApiStatus = ERROR_ALIAS_EXISTS;
415 goto done;
416 }
417
418 ApiStatus = NERR_Success;
419
420 /* Close the Builtin Domain */
421 SamCloseHandle(DomainHandle);
422 DomainHandle = NULL;
423
424 /* Open the account domain */
425 Status = OpenAccountDomain(ServerHandle,
426 (servername != NULL) ? &ServerName : NULL,
428 &DomainHandle);
429 if (!NT_SUCCESS(Status))
430 {
431 ERR("SamOpenDomain failed (Status %08lx)\n", Status);
432 ApiStatus = NetpNtStatusToApiStatus(Status);
433 goto done;
434 }
435
436 /* Create the alias */
437 Status = SamCreateAliasInDomain(DomainHandle,
438 &AliasName,
440 &AliasHandle,
441 &RelativeId);
442 if (!NT_SUCCESS(Status))
443 {
444 ERR("SamCreateAliasInDomain failed (Status %08lx)\n", Status);
445 ApiStatus = NetpNtStatusToApiStatus(Status);
446 goto done;
447 }
448
449 TRACE("Created alias \"%wZ\" (RID: %lu)\n", &AliasName, RelativeId);
450
451 /* Set the admin comment */
452 if (level == 1)
453 {
454 RtlInitUnicodeString(&AdminComment.AdminComment, aliascomment);
455
456 Status = SamSetInformationAlias(AliasHandle,
458 &AdminComment);
459 if (!NT_SUCCESS(Status))
460 {
461 ERR("SamSetInformationAlias failed (Status %08lx)\n", Status);
462 ApiStatus = NetpNtStatusToApiStatus(Status);
463
464 /* Delete the Alias if the Comment could not be set */
465 SamDeleteAlias(AliasHandle);
466
467 goto done;
468 }
469 }
470
471done:
472 if (AliasHandle != NULL)
473 {
474 if (ApiStatus != NERR_Success)
475 SamDeleteAlias(AliasHandle);
476 else
477 SamCloseHandle(AliasHandle);
478 }
479
480 if (DomainHandle != NULL)
481 SamCloseHandle(DomainHandle);
482
483 if (ServerHandle != NULL)
484 SamCloseHandle(ServerHandle);
485
486 return ApiStatus;
487}
488
489
490/************************************************************
491 * NetLocalGroupAddMember (NETAPI32.@)
492 */
494WINAPI
496 LPCWSTR servername,
497 LPCWSTR groupname,
498 PSID membersid)
499{
501
502 TRACE("(%s %s %p)\n", debugstr_w(servername),
503 debugstr_w(groupname), membersid);
504
505 Member.lgrmi0_sid = membersid;
506
507 return NetLocalGroupAddMembers(servername,
508 groupname,
509 0,
510 (LPBYTE)&Member,
511 1);
512}
513
514
515/************************************************************
516 * NetLocalGroupAddMembers (NETAPI32.@)
517 */
519WINAPI
521 LPCWSTR servername,
522 LPCWSTR groupname,
523 DWORD level,
524 LPBYTE buf,
525 DWORD totalentries)
526{
527 UNICODE_STRING ServerName, *pServerName = NULL;
528 UNICODE_STRING AliasName;
529 SAM_HANDLE ServerHandle = NULL;
530 SAM_HANDLE DomainHandle = NULL;
531 SAM_HANDLE AliasHandle = NULL;
532 PLOCALGROUP_MEMBERS_INFO_0 MemberList = NULL;
533 ULONG i;
534 NET_API_STATUS ApiStatus = NERR_Success;
536
537 TRACE("(%s %s %d %p %d)\n", debugstr_w(servername),
538 debugstr_w(groupname), level, buf, totalentries);
539
540 if (servername != NULL)
541 {
542 RtlInitUnicodeString(&ServerName, servername);
543 pServerName = &ServerName;
544 }
545
546 RtlInitUnicodeString(&AliasName, groupname);
547
548 switch (level)
549 {
550 case 0:
551 MemberList = (PLOCALGROUP_MEMBERS_INFO_0)buf;
552 break;
553
554 case 3:
555 ApiStatus = BuildSidListFromDomainAndName(pServerName,
557 totalentries,
558 &MemberList);
559 if (ApiStatus != NERR_Success)
560 {
561 ERR("BuildSidListFromDomainAndName failed (ApiStatus %lu)\n", ApiStatus);
562 goto done;
563 }
564 break;
565
566 default:
567 ApiStatus = ERROR_INVALID_LEVEL;
568 goto done;
569 }
570
571 /* Connect to the SAM Server */
572 Status = SamConnect(pServerName,
573 &ServerHandle,
575 NULL);
576 if (!NT_SUCCESS(Status))
577 {
578 ERR("SamConnect failed (Status %08lx)\n", Status);
579 ApiStatus = NetpNtStatusToApiStatus(Status);
580 goto done;
581 }
582
583 /* Open the Builtin Domain */
584 Status = OpenBuiltinDomain(ServerHandle,
586 &DomainHandle);
587 if (!NT_SUCCESS(Status))
588 {
589 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status);
590 ApiStatus = NetpNtStatusToApiStatus(Status);
591 goto done;
592 }
593
594 /* Open the alias account in the builtin domain */
595 ApiStatus = OpenAliasByName(DomainHandle,
596 &AliasName,
598 &AliasHandle);
599 if (ApiStatus != NERR_Success && ApiStatus != ERROR_NONE_MAPPED)
600 {
601 ERR("OpenAliasByName(%wZ) failed (ApiStatus %lu)\n", &AliasName, ApiStatus);
602 goto done;
603 }
604
605 if (AliasHandle == NULL)
606 {
607 if (DomainHandle != NULL)
608 SamCloseHandle(DomainHandle);
609
610 /* Open the Acount Domain */
611 Status = OpenAccountDomain(ServerHandle,
612 pServerName,
614 &DomainHandle);
615 if (!NT_SUCCESS(Status))
616 {
617 ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
618 ApiStatus = NetpNtStatusToApiStatus(Status);
619 goto done;
620 }
621
622 /* Open the alias account in the account domain */
623 ApiStatus = OpenAliasByName(DomainHandle,
624 &AliasName,
626 &AliasHandle);
627 if (ApiStatus != NERR_Success)
628 {
629 ERR("OpenAliasByName(%wZ) failed (ApiStatus %lu)\n", &AliasName, ApiStatus);
630 if (ApiStatus == ERROR_NONE_MAPPED)
631 ApiStatus = NERR_GroupNotFound;
632 goto done;
633 }
634 }
635
636 /* Add new members to the alias */
637 for (i = 0; i < totalentries; i++)
638 {
639 Status = SamAddMemberToAlias(AliasHandle,
640 MemberList[i].lgrmi0_sid);
641 if (!NT_SUCCESS(Status))
642 {
643 ERR("SamAddMemberToAlias failed (Status %lu)\n", Status);
644 ApiStatus = NetpNtStatusToApiStatus(Status);
645 goto done;
646 }
647 }
648
649done:
650 if (level == 3 && MemberList != NULL)
651 {
652 for (i = 0; i < totalentries; i++)
653 {
654 if (MemberList[i].lgrmi0_sid != NULL)
655 NetApiBufferFree(MemberList[i].lgrmi0_sid);
656 }
657
658 NetApiBufferFree(MemberList);
659 }
660
661 if (AliasHandle != NULL)
662 SamCloseHandle(AliasHandle);
663
664 if (DomainHandle != NULL)
665 SamCloseHandle(DomainHandle);
666
667 if (ServerHandle != NULL)
668 SamCloseHandle(ServerHandle);
669
670 return ApiStatus;
671}
672
673
674/************************************************************
675 * NetLocalGroupDel (NETAPI32.@)
676 */
678WINAPI
680 LPCWSTR servername,
681 LPCWSTR groupname)
682{
683 UNICODE_STRING ServerName;
684 UNICODE_STRING GroupName;
685 SAM_HANDLE ServerHandle = NULL;
686 SAM_HANDLE DomainHandle = NULL;
687 SAM_HANDLE AliasHandle = NULL;
688 NET_API_STATUS ApiStatus = NERR_Success;
690
691 TRACE("(%s %s)\n", debugstr_w(servername), debugstr_w(groupname));
692
693 if (servername != NULL)
694 RtlInitUnicodeString(&ServerName, servername);
695
696 RtlInitUnicodeString(&GroupName, groupname);
697
698 /* Connect to the SAM Server */
699 Status = SamConnect((servername != NULL) ? &ServerName : NULL,
700 &ServerHandle,
702 NULL);
703 if (!NT_SUCCESS(Status))
704 {
705 ERR("SamConnect failed (Status %08lx)\n", Status);
706 ApiStatus = NetpNtStatusToApiStatus(Status);
707 goto done;
708 }
709
710 /* Open the Builtin Domain */
711 Status = OpenBuiltinDomain(ServerHandle,
713 &DomainHandle);
714 if (!NT_SUCCESS(Status))
715 {
716 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status);
717 ApiStatus = NetpNtStatusToApiStatus(Status);
718 goto done;
719 }
720
721 /* Open the alias account in the builtin domain */
722 ApiStatus = OpenAliasByName(DomainHandle,
723 &GroupName,
724 DELETE,
725 &AliasHandle);
726 if (ApiStatus != NERR_Success && ApiStatus != ERROR_NONE_MAPPED)
727 {
728 TRACE("OpenAliasByName(%wZ) failed (ApiStatus %lu)\n", &GroupName, ApiStatus);
729 goto done;
730 }
731
732 if (AliasHandle == NULL)
733 {
734 if (DomainHandle != NULL)
735 {
736 SamCloseHandle(DomainHandle);
737 DomainHandle = NULL;
738 }
739
740 /* Open the Acount Domain */
741 Status = OpenAccountDomain(ServerHandle,
742 (servername != NULL) ? &ServerName : NULL,
744 &DomainHandle);
745 if (!NT_SUCCESS(Status))
746 {
747 ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
748 ApiStatus = NetpNtStatusToApiStatus(Status);
749 goto done;
750 }
751
752 /* Open the alias account in the account domain */
753 ApiStatus = OpenAliasByName(DomainHandle,
754 &GroupName,
755 DELETE,
756 &AliasHandle);
757 if (ApiStatus != NERR_Success)
758 {
759 ERR("OpenAliasByName(%wZ) failed (ApiStatus %lu)\n", &GroupName, ApiStatus);
760 if (ApiStatus == ERROR_NONE_MAPPED)
761 ApiStatus = NERR_GroupNotFound;
762 goto done;
763 }
764 }
765
766 /* Delete the alias */
767 Status = SamDeleteAlias(AliasHandle);
768 if (!NT_SUCCESS(Status))
769 {
770 ERR("SamDeleteAlias failed (Status %08lx)\n", Status);
771 ApiStatus = NetpNtStatusToApiStatus(Status);
772 goto done;
773 }
774
775done:
776 if (AliasHandle != NULL)
777 SamCloseHandle(AliasHandle);
778
779 if (DomainHandle != NULL)
780 SamCloseHandle(DomainHandle);
781
782 if (ServerHandle != NULL)
783 SamCloseHandle(ServerHandle);
784
785 return ApiStatus;
786}
787
788
789/************************************************************
790 * NetLocalGroupDelMember (NETAPI32.@)
791 */
793WINAPI
795 LPCWSTR servername,
796 LPCWSTR groupname,
797 PSID membersid)
798{
800
801 TRACE("(%s %s %p)\n", debugstr_w(servername),
802 debugstr_w(groupname), membersid);
803
804 Member.lgrmi0_sid = membersid;
805
806 return NetLocalGroupDelMembers(servername,
807 groupname,
808 0,
809 (LPBYTE)&Member,
810 1);
811}
812
813
814/************************************************************
815 * NetLocalGroupDelMembers (NETAPI32.@)
816 */
818WINAPI
820 LPCWSTR servername,
821 LPCWSTR groupname,
822 DWORD level,
823 LPBYTE buf,
824 DWORD totalentries)
825{
826 UNICODE_STRING ServerName, *pServerName = NULL;
827 UNICODE_STRING AliasName;
828 SAM_HANDLE ServerHandle = NULL;
829 SAM_HANDLE DomainHandle = NULL;
830 SAM_HANDLE AliasHandle = NULL;
831 PLOCALGROUP_MEMBERS_INFO_0 MemberList = NULL;
832 ULONG i;
833 NET_API_STATUS ApiStatus = NERR_Success;
835
836 TRACE("(%s %s %d %p %d)\n", debugstr_w(servername),
837 debugstr_w(groupname), level, buf, totalentries);
838
839 if (servername != NULL)
840 {
841 RtlInitUnicodeString(&ServerName, servername);
842 pServerName = &ServerName;
843 }
844
845 RtlInitUnicodeString(&AliasName, groupname);
846
847 switch (level)
848 {
849 case 0:
850 MemberList = (PLOCALGROUP_MEMBERS_INFO_0)buf;
851 break;
852
853 case 3:
854 ApiStatus = BuildSidListFromDomainAndName(pServerName,
856 totalentries,
857 &MemberList);
858 if (ApiStatus)
859 {
860 ERR("BuildSidListFromDomainAndName failed (ApiStatus %lu)\n", ApiStatus);
861 goto done;
862 }
863 break;
864
865 default:
866 ApiStatus = ERROR_INVALID_LEVEL;
867 goto done;
868 }
869
870 /* Connect to the SAM Server */
871 Status = SamConnect(pServerName,
872 &ServerHandle,
874 NULL);
875 if (!NT_SUCCESS(Status))
876 {
877 ERR("SamConnect failed (Status %08lx)\n", Status);
878 ApiStatus = NetpNtStatusToApiStatus(Status);
879 goto done;
880 }
881
882 /* Open the Builtin Domain */
883 Status = OpenBuiltinDomain(ServerHandle,
885 &DomainHandle);
886 if (!NT_SUCCESS(Status))
887 {
888 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status);
889 ApiStatus = NetpNtStatusToApiStatus(Status);
890 goto done;
891 }
892
893 /* Open the alias account in the builtin domain */
894 ApiStatus = OpenAliasByName(DomainHandle,
895 &AliasName,
897 &AliasHandle);
898 if (ApiStatus != NERR_Success && ApiStatus != ERROR_NONE_MAPPED)
899 {
900 ERR("OpenAliasByName(%wZ) failed (ApiStatus %lu)\n", &AliasName, ApiStatus);
901 goto done;
902 }
903
904 if (AliasHandle == NULL)
905 {
906 if (DomainHandle != NULL)
907 SamCloseHandle(DomainHandle);
908
909 /* Open the Acount Domain */
910 Status = OpenAccountDomain(ServerHandle,
911 pServerName,
913 &DomainHandle);
914 if (!NT_SUCCESS(Status))
915 {
916 ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
917 ApiStatus = NetpNtStatusToApiStatus(Status);
918 goto done;
919 }
920
921 /* Open the alias account in the account domain */
922 ApiStatus = OpenAliasByName(DomainHandle,
923 &AliasName,
925 &AliasHandle);
926 if (ApiStatus != NERR_Success)
927 {
928 ERR("OpenAliasByName(%wZ) failed (ApiStatus %lu)\n", &AliasName, ApiStatus);
929 if (ApiStatus == ERROR_NONE_MAPPED)
930 ApiStatus = NERR_GroupNotFound;
931 goto done;
932 }
933 }
934
935 /* Remove members from the alias */
936 for (i = 0; i < totalentries; i++)
937 {
938 Status = SamRemoveMemberFromAlias(AliasHandle,
939 MemberList[i].lgrmi0_sid);
940 if (!NT_SUCCESS(Status))
941 {
942 ERR("SamAddMemberToAlias failed (Status %lu)\n", Status);
943 ApiStatus = NetpNtStatusToApiStatus(Status);
944 goto done;
945 }
946 }
947
948done:
949 if (level == 3 && MemberList != NULL)
950 {
951 for (i = 0; i < totalentries; i++)
952 {
953 if (MemberList[i].lgrmi0_sid != NULL)
954 NetApiBufferFree(MemberList[i].lgrmi0_sid);
955 }
956
957 NetApiBufferFree(MemberList);
958 }
959
960 if (AliasHandle != NULL)
961 SamCloseHandle(AliasHandle);
962
963 if (DomainHandle != NULL)
964 SamCloseHandle(DomainHandle);
965
966 if (ServerHandle != NULL)
967 SamCloseHandle(ServerHandle);
968
969 return ApiStatus;
970}
971
972
973/************************************************************
974 * NetLocalGroupEnum (NETAPI32.@)
975 */
977WINAPI
979 LPCWSTR servername,
980 DWORD level,
981 LPBYTE* bufptr,
982 DWORD prefmaxlen,
983 LPDWORD entriesread,
984 LPDWORD totalentries,
985 PDWORD_PTR resumehandle)
986{
987 UNICODE_STRING ServerName;
988 PSAM_RID_ENUMERATION CurrentAlias;
989 PENUM_CONTEXT EnumContext = NULL;
990 ULONG i;
991 SAM_HANDLE AliasHandle = NULL;
994 NET_API_STATUS ApiStatus = NERR_Success;
996
997 TRACE("(%s %d %p %d %p %p %p) stub!\n", debugstr_w(servername),
998 level, bufptr, prefmaxlen, entriesread, totalentries, resumehandle);
999
1000 *entriesread = 0;
1001 *totalentries = 0;
1002 *bufptr = NULL;
1003
1004 if (servername != NULL)
1005 RtlInitUnicodeString(&ServerName, servername);
1006
1007 if (resumehandle != NULL && *resumehandle != 0)
1008 {
1009 EnumContext = (PENUM_CONTEXT)*resumehandle;
1010 }
1011 else
1012 {
1013 ApiStatus = NetApiBufferAllocate(sizeof(ENUM_CONTEXT), (PVOID*)&EnumContext);
1014 if (ApiStatus != NERR_Success)
1015 goto done;
1016
1017 EnumContext->EnumerationContext = 0;
1018 EnumContext->Buffer = NULL;
1019 EnumContext->Returned = 0;
1020 EnumContext->Index = 0;
1021
1022 Status = SamConnect((servername != NULL) ? &ServerName : NULL,
1023 &EnumContext->ServerHandle,
1025 NULL);
1026 if (!NT_SUCCESS(Status))
1027 {
1028 ERR("SamConnect failed (Status %08lx)\n", Status);
1029 ApiStatus = NetpNtStatusToApiStatus(Status);
1030 goto done;
1031 }
1032
1033 Status = OpenAccountDomain(EnumContext->ServerHandle,
1034 (servername != NULL) ? &ServerName : NULL,
1036 &EnumContext->AccountDomainHandle);
1037 if (!NT_SUCCESS(Status))
1038 {
1039 ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
1040 ApiStatus = NetpNtStatusToApiStatus(Status);
1041 goto done;
1042 }
1043
1044 Status = OpenBuiltinDomain(EnumContext->ServerHandle,
1046 &EnumContext->BuiltinDomainHandle);
1047 if (!NT_SUCCESS(Status))
1048 {
1049 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status);
1050 ApiStatus = NetpNtStatusToApiStatus(Status);
1051 goto done;
1052 }
1053
1054 EnumContext->Phase = BuiltinPhase;
1055 EnumContext->DomainHandle = EnumContext->BuiltinDomainHandle;
1056 }
1057
1058
1059// while (TRUE)
1060// {
1061 TRACE("EnumContext->Index: %lu\n", EnumContext->Index);
1062 TRACE("EnumContext->Returned: %lu\n", EnumContext->Returned);
1063
1064 if (EnumContext->Index >= EnumContext->Returned)
1065 {
1066 TRACE("Calling SamEnumerateAliasesInDomain\n");
1067
1069 &EnumContext->EnumerationContext,
1070 (PVOID *)&EnumContext->Buffer,
1071 prefmaxlen,
1072 &EnumContext->Returned);
1073
1074 TRACE("SamEnumerateAliasesInDomain returned (Status %08lx)\n", Status);
1075 if (!NT_SUCCESS(Status))
1076 {
1077 ERR("SamEnumerateAliasesInDomain failed (Status %08lx)\n", Status);
1078 ApiStatus = NetpNtStatusToApiStatus(Status);
1079 goto done;
1080 }
1081
1083 {
1084 ApiStatus = NERR_BufTooSmall;
1085 goto done;
1086 }
1087 }
1088
1089 TRACE("EnumContext: %lu\n", EnumContext);
1090 TRACE("EnumContext->Returned: %lu\n", EnumContext->Returned);
1091 TRACE("EnumContext->Buffer: %p\n", EnumContext->Buffer);
1092
1093 /* Get a pointer to the current alias */
1094 CurrentAlias = &EnumContext->Buffer[EnumContext->Index];
1095
1096 TRACE("RID: %lu\n", CurrentAlias->RelativeId);
1097
1098 Status = SamOpenAlias(EnumContext->DomainHandle,
1100 CurrentAlias->RelativeId,
1101 &AliasHandle);
1102 if (!NT_SUCCESS(Status))
1103 {
1104 ERR("SamOpenAlias failed (Status %08lx)\n", Status);
1105 ApiStatus = NetpNtStatusToApiStatus(Status);
1106 goto done;
1107 }
1108
1109 Status = SamQueryInformationAlias(AliasHandle,
1111 (PVOID *)&AliasInfo);
1112 if (!NT_SUCCESS(Status))
1113 {
1114 ERR("SamQueryInformationAlias failed (Status %08lx)\n", Status);
1115 ApiStatus = NetpNtStatusToApiStatus(Status);
1116 goto done;
1117 }
1118
1119 SamCloseHandle(AliasHandle);
1120 AliasHandle = NULL;
1121
1122 TRACE("Name: %S\n", AliasInfo->Name.Buffer);
1123 TRACE("Comment: %S\n", AliasInfo->AdminComment.Buffer);
1124
1125 ApiStatus = BuildAliasInfoBuffer(AliasInfo,
1126 level,
1127 &Buffer);
1128 if (ApiStatus != NERR_Success)
1129 goto done;
1130
1131 if (AliasInfo != NULL)
1132 {
1133 FreeAliasInfo(AliasInfo);
1134 AliasInfo = NULL;
1135 }
1136
1137 EnumContext->Index++;
1138
1139 (*entriesread)++;
1140
1141 if (EnumContext->Index == EnumContext->Returned)
1142 {
1143 switch (EnumContext->Phase)
1144 {
1145 case BuiltinPhase:
1146 EnumContext->Phase = AccountPhase;
1147 EnumContext->DomainHandle = EnumContext->AccountDomainHandle;
1148 EnumContext->EnumerationContext = 0;
1149 EnumContext->Index = 0;
1150 EnumContext->Returned = 0;
1151
1152 if (EnumContext->Buffer != NULL)
1153 {
1154 for (i = 0; i < EnumContext->Returned; i++)
1155 {
1156 SamFreeMemory(EnumContext->Buffer[i].Name.Buffer);
1157 }
1158
1159 SamFreeMemory(EnumContext->Buffer);
1160 EnumContext->Buffer = NULL;
1161 }
1162 break;
1163
1164 case AccountPhase:
1165 case DonePhase:
1166 EnumContext->Phase = DonePhase;
1167 break;
1168 }
1169 }
1170// }
1171
1172done:
1173 if (ApiStatus == NERR_Success && EnumContext != NULL && EnumContext->Phase != DonePhase)
1174 ApiStatus = ERROR_MORE_DATA;
1175
1176 if (EnumContext != NULL)
1177 *totalentries = EnumContext->Returned;
1178
1179 if (resumehandle == NULL || ApiStatus != ERROR_MORE_DATA)
1180 {
1181 if (EnumContext != NULL)
1182 {
1183 if (EnumContext->BuiltinDomainHandle != NULL)
1184 SamCloseHandle(EnumContext->BuiltinDomainHandle);
1185
1186 if (EnumContext->AccountDomainHandle != NULL)
1187 SamCloseHandle(EnumContext->AccountDomainHandle);
1188
1189 if (EnumContext->ServerHandle != NULL)
1190 SamCloseHandle(EnumContext->ServerHandle);
1191
1192 if (EnumContext->Buffer != NULL)
1193 {
1194 for (i = 0; i < EnumContext->Returned; i++)
1195 {
1196 SamFreeMemory(EnumContext->Buffer[i].Name.Buffer);
1197 }
1198
1199 SamFreeMemory(EnumContext->Buffer);
1200 }
1201
1202 NetApiBufferFree(EnumContext);
1203 EnumContext = NULL;
1204 }
1205 }
1206
1207 if (AliasHandle != NULL)
1208 SamCloseHandle(AliasHandle);
1209
1210 if (AliasInfo != NULL)
1211 FreeAliasInfo(AliasInfo);
1212
1213 if (resumehandle != NULL)
1214 *resumehandle = (DWORD_PTR)EnumContext;
1215
1216 *bufptr = (LPBYTE)Buffer;
1217
1218 TRACE ("return %lu\n", ApiStatus);
1219
1220 return ApiStatus;
1221}
1222
1223
1224/************************************************************
1225 * NetLocalGroupGetInfo (NETAPI32.@)
1226 */
1228WINAPI
1230 LPCWSTR servername,
1231 LPCWSTR groupname,
1232 DWORD level,
1233 LPBYTE* bufptr)
1234{
1235 UNICODE_STRING ServerName;
1236 UNICODE_STRING GroupName;
1237 SAM_HANDLE ServerHandle = NULL;
1238 SAM_HANDLE DomainHandle = NULL;
1239 SAM_HANDLE AliasHandle = NULL;
1240 PALIAS_GENERAL_INFORMATION AliasInfo = NULL;
1241 LPVOID Buffer = NULL;
1242 NET_API_STATUS ApiStatus = NERR_Success;
1244
1245 TRACE("(%s %s %d %p) stub!\n", debugstr_w(servername),
1246 debugstr_w(groupname), level, bufptr);
1247
1248 if (servername != NULL)
1249 RtlInitUnicodeString(&ServerName, servername);
1250
1251 RtlInitUnicodeString(&GroupName, groupname);
1252
1253 /* Connect to the SAM Server */
1254 Status = SamConnect((servername != NULL) ? &ServerName : NULL,
1255 &ServerHandle,
1257 NULL);
1258 if (!NT_SUCCESS(Status))
1259 {
1260 ERR("SamConnect failed (Status %08lx)\n", Status);
1261 ApiStatus = NetpNtStatusToApiStatus(Status);
1262 goto done;
1263 }
1264
1265 /* Open the Builtin Domain */
1266 Status = OpenBuiltinDomain(ServerHandle,
1268 &DomainHandle);
1269 if (!NT_SUCCESS(Status))
1270 {
1271 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status);
1272 ApiStatus = NetpNtStatusToApiStatus(Status);
1273 goto done;
1274 }
1275
1276 /* Open the alias account in the builtin domain */
1277 ApiStatus = OpenAliasByName(DomainHandle,
1278 &GroupName,
1280 &AliasHandle);
1281 if (ApiStatus != NERR_Success && ApiStatus != ERROR_NONE_MAPPED)
1282 {
1283 ERR("OpenAliasByName(%wZ) failed (ApiStatus %lu)\n", &GroupName, ApiStatus);
1284 goto done;
1285 }
1286
1287 if (AliasHandle == NULL)
1288 {
1289 if (DomainHandle != NULL)
1290 SamCloseHandle(DomainHandle);
1291
1292 /* Open the Acount Domain */
1293 Status = OpenAccountDomain(ServerHandle,
1294 (servername != NULL) ? &ServerName : NULL,
1296 &DomainHandle);
1297 if (!NT_SUCCESS(Status))
1298 {
1299 ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
1300 ApiStatus = NetpNtStatusToApiStatus(Status);
1301 goto done;
1302 }
1303
1304 /* Open the alias account in the account domain */
1305 ApiStatus = OpenAliasByName(DomainHandle,
1306 &GroupName,
1308 &AliasHandle);
1309 if (ApiStatus != NERR_Success)
1310 {
1311 ERR("OpenAliasByName(%wZ) failed (ApiStatus %lu)\n", &GroupName, ApiStatus);
1312 if (ApiStatus == ERROR_NONE_MAPPED)
1313 ApiStatus = NERR_GroupNotFound;
1314 goto done;
1315 }
1316 }
1317
1318 Status = SamQueryInformationAlias(AliasHandle,
1320 (PVOID *)&AliasInfo);
1321 if (!NT_SUCCESS(Status))
1322 {
1323 ERR("SamQueryInformationAlias failed (Status %08lx)\n", Status);
1324 ApiStatus = NetpNtStatusToApiStatus(Status);
1325 goto done;
1326 }
1327
1328 ApiStatus = BuildAliasInfoBuffer(AliasInfo,
1329 level,
1330 &Buffer);
1331 if (ApiStatus != NERR_Success)
1332 goto done;
1333
1334done:
1335 if (AliasInfo != NULL)
1336 FreeAliasInfo(AliasInfo);
1337
1338 if (AliasHandle != NULL)
1339 SamCloseHandle(AliasHandle);
1340
1341 if (DomainHandle != NULL)
1342 SamCloseHandle(DomainHandle);
1343
1344 if (ServerHandle != NULL)
1345 SamCloseHandle(ServerHandle);
1346
1347 *bufptr = (LPBYTE)Buffer;
1348
1349 return ApiStatus;
1350}
1351
1352
1353/************************************************************
1354 * NetLocalGroupGetMembers (NETAPI32.@)
1355 */
1357WINAPI
1359 LPCWSTR servername,
1360 LPCWSTR localgroupname,
1361 DWORD level,
1362 LPBYTE* bufptr,
1363 DWORD prefmaxlen,
1364 LPDWORD entriesread,
1365 LPDWORD totalentries,
1366 PDWORD_PTR resumehandle)
1367{
1369 UNICODE_STRING ServerName;
1370 UNICODE_STRING AliasName;
1371 PMEMBER_ENUM_CONTEXT EnumContext = NULL;
1372 LPVOID Buffer = NULL;
1373 PLOCALGROUP_MEMBERS_INFO_0 MembersInfo0;
1374 PLOCALGROUP_MEMBERS_INFO_1 MembersInfo1;
1375 PLOCALGROUP_MEMBERS_INFO_2 MembersInfo2;
1376 PLOCALGROUP_MEMBERS_INFO_3 MembersInfo3;
1377 LPWSTR Ptr;
1378 ULONG Size = 0;
1379 ULONG SidLength;
1380 ULONG i;
1381 NET_API_STATUS ApiStatus = NERR_Success;
1383
1384 TRACE("(%s %s %d %p %d %p %p %p)\n", debugstr_w(servername),
1385 debugstr_w(localgroupname), level, bufptr, prefmaxlen, entriesread,
1386 totalentries, resumehandle);
1387
1388 *entriesread = 0;
1389 *totalentries = 0;
1390 *bufptr = NULL;
1391
1392 if (servername != NULL)
1393 RtlInitUnicodeString(&ServerName, servername);
1394
1395 RtlInitUnicodeString(&AliasName, localgroupname);
1396
1397 if (resumehandle != NULL && *resumehandle != 0)
1398 {
1399 EnumContext = (PMEMBER_ENUM_CONTEXT)*resumehandle;
1400 }
1401 else
1402 {
1403 /* Allocate the enumeration context */
1404 ApiStatus = NetApiBufferAllocate(sizeof(MEMBER_ENUM_CONTEXT), (PVOID*)&EnumContext);
1405 if (ApiStatus != NERR_Success)
1406 goto done;
1407
1408 /* Connect to the SAM Server */
1409 Status = SamConnect((servername != NULL) ? &ServerName : NULL,
1410 &EnumContext->ServerHandle,
1412 NULL);
1413 if (!NT_SUCCESS(Status))
1414 {
1415 ERR("SamConnect failed (Status %08lx)\n", Status);
1416 ApiStatus = NetpNtStatusToApiStatus(Status);
1417 goto done;
1418 }
1419
1420 /* Open the Builtin Domain */
1421 Status = OpenBuiltinDomain(EnumContext->ServerHandle,
1423 &EnumContext->DomainHandle);
1424 if (!NT_SUCCESS(Status))
1425 {
1426 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status);
1427 ApiStatus = NetpNtStatusToApiStatus(Status);
1428 goto done;
1429 }
1430
1431 /* Open the alias account in the builtin domain */
1432 ApiStatus = OpenAliasByName(EnumContext->DomainHandle,
1433 &AliasName,
1435 &EnumContext->AliasHandle);
1436 if (ApiStatus != NERR_Success && ApiStatus != ERROR_NONE_MAPPED)
1437 {
1438 ERR("OpenAliasByName(%wZ) failed (ApiStatus %lu)\n", &AliasName, ApiStatus);
1439 goto done;
1440 }
1441
1442 if (EnumContext->AliasHandle == NULL)
1443 {
1444 if (EnumContext->DomainHandle != NULL)
1445 SamCloseHandle(EnumContext->DomainHandle);
1446
1447 /* Open the Acount Domain */
1448 Status = OpenAccountDomain(EnumContext->ServerHandle,
1449 (servername != NULL) ? &ServerName : NULL,
1451 &EnumContext->DomainHandle);
1452 if (!NT_SUCCESS(Status))
1453 {
1454 ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
1455 ApiStatus = NetpNtStatusToApiStatus(Status);
1456 goto done;
1457 }
1458
1459 /* Open the alias account in the account domain */
1460 ApiStatus = OpenAliasByName(EnumContext->DomainHandle,
1461 &AliasName,
1463 &EnumContext->AliasHandle);
1464 if (ApiStatus != NERR_Success)
1465 {
1466 ERR("OpenAliasByName(%wZ) failed (ApiStatus %lu)\n", &AliasName, ApiStatus);
1467 if (ApiStatus == ERROR_NONE_MAPPED)
1468 ApiStatus = NERR_GroupNotFound;
1469 goto done;
1470 }
1471 }
1472
1473 /* Get the member list */
1474 Status = SamGetMembersInAlias(EnumContext->AliasHandle,
1475 &EnumContext->Sids,
1476 &EnumContext->Count);
1477 if (!NT_SUCCESS(Status))
1478 {
1479 ERR("SamGetMemberInAlias failed (Status %08lx)\n", Status);
1480 ApiStatus = NetpNtStatusToApiStatus(Status);
1481 goto done;
1482 }
1483
1484 if (EnumContext->Count == 0)
1485 {
1486 TRACE("No member found. We're done.\n");
1487 ApiStatus = NERR_Success;
1488 goto done;
1489 }
1490
1491 /* Get name and domain information for all members */
1492 if (level != 0)
1493 {
1495 NULL,
1496 0,
1497 0,
1498 NULL);
1499
1500 Status = LsaOpenPolicy((servername != NULL) ? &ServerName : NULL,
1503 &EnumContext->LsaHandle);
1504 if (!NT_SUCCESS(Status))
1505 {
1506 ApiStatus = NetpNtStatusToApiStatus(Status);
1507 goto done;
1508 }
1509
1510 Status = LsaLookupSids(EnumContext->LsaHandle,
1511 EnumContext->Count,
1512 EnumContext->Sids,
1513 &EnumContext->Domains,
1514 &EnumContext->Names);
1515 if (!NT_SUCCESS(Status))
1516 {
1517 ApiStatus = NetpNtStatusToApiStatus(Status);
1518 goto done;
1519 }
1520 }
1521 }
1522
1523 /* Calculate the required buffer size */
1524 for (i = 0; i < EnumContext->Count; i++)
1525 {
1526 switch (level)
1527 {
1528 case 0:
1529 Size += sizeof(LOCALGROUP_MEMBERS_INFO_0) +
1530 RtlLengthSid(EnumContext->Sids[i]);
1531 break;
1532
1533 case 1:
1534 Size += sizeof(LOCALGROUP_MEMBERS_INFO_1) +
1535 RtlLengthSid(EnumContext->Sids[i]) +
1536 EnumContext->Names[i].Name.Length + sizeof(WCHAR);
1537 break;
1538
1539 case 2:
1540 Size += sizeof(LOCALGROUP_MEMBERS_INFO_2) +
1541 RtlLengthSid(EnumContext->Sids[i]) +
1542 EnumContext->Names[i].Name.Length + sizeof(WCHAR);
1543 if (EnumContext->Names[i].DomainIndex >= 0)
1544 Size += EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length + sizeof(WCHAR);
1545 break;
1546
1547 case 3:
1548 Size += sizeof(LOCALGROUP_MEMBERS_INFO_3) +
1549 EnumContext->Names[i].Name.Length + sizeof(WCHAR);
1550 if (EnumContext->Names[i].DomainIndex >= 0)
1551 Size += EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length + sizeof(WCHAR);
1552 break;
1553
1554 default:
1555 ApiStatus = ERROR_INVALID_LEVEL;
1556 goto done;
1557 }
1558 }
1559
1560 /* Allocate the member buffer */
1561 ApiStatus = NetApiBufferAllocate(Size, &Buffer);
1562 if (ApiStatus != NERR_Success)
1563 goto done;
1564
1566
1567 /* Fill the member buffer */
1568 switch (level)
1569 {
1570 case 0:
1571 MembersInfo0 = (PLOCALGROUP_MEMBERS_INFO_0)Buffer;
1572 Ptr = (PVOID)((ULONG_PTR)Buffer + sizeof(LOCALGROUP_MEMBERS_INFO_0) * EnumContext->Count);
1573 break;
1574
1575 case 1:
1576 MembersInfo1 = (PLOCALGROUP_MEMBERS_INFO_1)Buffer;
1577 Ptr = (PVOID)((ULONG_PTR)Buffer + sizeof(LOCALGROUP_MEMBERS_INFO_1) * EnumContext->Count);
1578 break;
1579
1580 case 2:
1581 MembersInfo2 = (PLOCALGROUP_MEMBERS_INFO_2)Buffer;
1582 Ptr = (PVOID)((ULONG_PTR)Buffer + sizeof(LOCALGROUP_MEMBERS_INFO_2) * EnumContext->Count);
1583 break;
1584
1585 case 3:
1586 MembersInfo3 = (PLOCALGROUP_MEMBERS_INFO_3)Buffer;
1587 Ptr = (PVOID)((ULONG_PTR)Buffer + sizeof(LOCALGROUP_MEMBERS_INFO_3) * EnumContext->Count);
1588 break;
1589 }
1590
1591 for (i = 0; i < EnumContext->Count; i++)
1592 {
1593 switch (level)
1594 {
1595 case 0:
1596 MembersInfo0->lgrmi0_sid = (PSID)Ptr;
1597
1598 SidLength = RtlLengthSid(EnumContext->Sids[i]);
1599 memcpy(MembersInfo0->lgrmi0_sid,
1600 EnumContext->Sids[i],
1601 SidLength);
1602 Ptr = (PVOID)((ULONG_PTR)Ptr + SidLength);
1603 MembersInfo0++;
1604 break;
1605
1606 case 1:
1607 MembersInfo1->lgrmi1_sid = (PSID)Ptr;
1608
1609 SidLength = RtlLengthSid(EnumContext->Sids[i]);
1610 memcpy(MembersInfo1->lgrmi1_sid,
1611 EnumContext->Sids[i],
1612 SidLength);
1613
1614 Ptr = (PVOID)((ULONG_PTR)Ptr + SidLength);
1615
1616 MembersInfo1->lgrmi1_sidusage = EnumContext->Names[i].Use;
1617
1618 TRACE("Name: %S\n", EnumContext->Names[i].Name.Buffer);
1619
1620 MembersInfo1->lgrmi1_name = Ptr;
1621
1622 memcpy(MembersInfo1->lgrmi1_name,
1623 EnumContext->Names[i].Name.Buffer,
1624 EnumContext->Names[i].Name.Length);
1625 Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Names[i].Name.Length + sizeof(WCHAR));
1626 MembersInfo1++;
1627 break;
1628
1629 case 2:
1630 MembersInfo2->lgrmi2_sid = (PSID)Ptr;
1631
1632 SidLength = RtlLengthSid(EnumContext->Sids[i]);
1633 memcpy(MembersInfo2->lgrmi2_sid,
1634 EnumContext->Sids[i],
1635 SidLength);
1636
1637 Ptr = (PVOID)((ULONG_PTR)Ptr + SidLength);
1638
1639 MembersInfo2->lgrmi2_sidusage = EnumContext->Names[i].Use;
1640
1641 MembersInfo2->lgrmi2_domainandname = Ptr;
1642
1643 if (EnumContext->Names[i].DomainIndex >= 0)
1644 {
1645 memcpy(MembersInfo2->lgrmi2_domainandname,
1646 EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Buffer,
1647 EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
1648
1649 Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
1650
1651 *((LPWSTR)Ptr) = L'\\';
1652
1653 Ptr = (PVOID)((ULONG_PTR)Ptr + sizeof(WCHAR));
1654 }
1655
1656 memcpy(Ptr,
1657 EnumContext->Names[i].Name.Buffer,
1658 EnumContext->Names[i].Name.Length);
1659 Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Names[i].Name.Length + sizeof(WCHAR));
1660 MembersInfo2++;
1661 break;
1662
1663 case 3:
1664 MembersInfo3->lgrmi3_domainandname = Ptr;
1665
1666 if (EnumContext->Names[i].DomainIndex >= 0)
1667 {
1668 memcpy(MembersInfo3->lgrmi3_domainandname,
1669 EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Buffer,
1670 EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
1671
1672 Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Domains->Domains[EnumContext->Names[i].DomainIndex].Name.Length);
1673
1674 *((LPWSTR)Ptr) = L'\\';
1675
1676 Ptr = (PVOID)((ULONG_PTR)Ptr + sizeof(WCHAR));
1677 }
1678
1679 memcpy(Ptr,
1680 EnumContext->Names[i].Name.Buffer,
1681 EnumContext->Names[i].Name.Length);
1682 Ptr = (PVOID)((ULONG_PTR)Ptr + EnumContext->Names[i].Name.Length + sizeof(WCHAR));
1683 MembersInfo3++;
1684 break;
1685 }
1686 }
1687
1688 *entriesread = EnumContext->Count;
1689
1690 *bufptr = (LPBYTE)Buffer;
1691
1692done:
1693 if (EnumContext != NULL)
1694 *totalentries = EnumContext->Count;
1695
1696 if (resumehandle == NULL || ApiStatus != ERROR_MORE_DATA)
1697 {
1698 /* Release the enumeration context */
1699 if (EnumContext != NULL)
1700 {
1701 if (EnumContext->LsaHandle != NULL)
1702 LsaClose(EnumContext->LsaHandle);
1703
1704 if (EnumContext->AliasHandle != NULL)
1705 SamCloseHandle(EnumContext->AliasHandle);
1706
1707 if (EnumContext->DomainHandle != NULL)
1708 SamCloseHandle(EnumContext->DomainHandle);
1709
1710 if (EnumContext->ServerHandle != NULL)
1711 SamCloseHandle(EnumContext->ServerHandle);
1712
1713 if (EnumContext->Sids != NULL)
1714 SamFreeMemory(EnumContext->Sids);
1715
1716 if (EnumContext->Domains != NULL)
1717 LsaFreeMemory(EnumContext->Domains);
1718
1719 if (EnumContext->Names != NULL)
1720 LsaFreeMemory(EnumContext->Names);
1721
1722 NetApiBufferFree(EnumContext);
1723 EnumContext = NULL;
1724 }
1725 }
1726
1727 return ApiStatus;
1728}
1729
1730
1731/************************************************************
1732 * NetLocalGroupSetInfo (NETAPI32.@)
1733 */
1735WINAPI
1737 LPCWSTR servername,
1738 LPCWSTR groupname,
1739 DWORD level,
1740 LPBYTE buf,
1741 LPDWORD parm_err)
1742{
1743 UNICODE_STRING ServerName;
1744 UNICODE_STRING AliasName;
1745 SAM_HANDLE ServerHandle = NULL;
1746 SAM_HANDLE DomainHandle = NULL;
1747 SAM_HANDLE AliasHandle = NULL;
1748 ALIAS_NAME_INFORMATION AliasNameInfo;
1749 ALIAS_ADM_COMMENT_INFORMATION AdminCommentInfo;
1750 NET_API_STATUS ApiStatus = NERR_Success;
1752
1753 TRACE("(%s %s %d %p %p)\n", debugstr_w(servername),
1754 debugstr_w(groupname), level, buf, parm_err);
1755
1756 if (parm_err != NULL)
1757 *parm_err = PARM_ERROR_NONE;
1758
1759 if (servername != NULL)
1760 RtlInitUnicodeString(&ServerName, servername);
1761
1762 RtlInitUnicodeString(&AliasName, groupname);
1763
1764 /* Connect to the SAM Server */
1765 Status = SamConnect((servername != NULL) ? &ServerName : NULL,
1766 &ServerHandle,
1768 NULL);
1769 if (!NT_SUCCESS(Status))
1770 {
1771 ERR("SamConnect failed (Status %08lx)\n", Status);
1772 ApiStatus = NetpNtStatusToApiStatus(Status);
1773 goto done;
1774 }
1775
1776 /* Open the Builtin Domain */
1777 Status = OpenBuiltinDomain(ServerHandle,
1779 &DomainHandle);
1780 if (!NT_SUCCESS(Status))
1781 {
1782 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status);
1783 ApiStatus = NetpNtStatusToApiStatus(Status);
1784 goto done;
1785 }
1786
1787 /* Open the alias account in the builtin domain */
1788 ApiStatus = OpenAliasByName(DomainHandle,
1789 &AliasName,
1791 &AliasHandle);
1792 if (ApiStatus != NERR_Success && ApiStatus != ERROR_NONE_MAPPED)
1793 {
1794 ERR("OpenAliasByName(%wZ) failed (ApiStatus %lu)\n", &AliasName, ApiStatus);
1795 goto done;
1796 }
1797
1798 if (AliasHandle == NULL)
1799 {
1800 if (DomainHandle != NULL)
1801 SamCloseHandle(DomainHandle);
1802
1803 /* Open the Acount Domain */
1804 Status = OpenAccountDomain(ServerHandle,
1805 (servername != NULL) ? &ServerName : NULL,
1807 &DomainHandle);
1808 if (!NT_SUCCESS(Status))
1809 {
1810 ERR("OpenAccountDomain failed (Status %08lx)\n", Status);
1811 ApiStatus = NetpNtStatusToApiStatus(Status);
1812 goto done;
1813 }
1814
1815 /* Open the alias account in the account domain */
1816 ApiStatus = OpenAliasByName(DomainHandle,
1817 &AliasName,
1819 &AliasHandle);
1820 if (ApiStatus != NERR_Success)
1821 {
1822 ERR("OpenAliasByName(%wZ) failed (ApiStatus %lu)\n", &AliasName, ApiStatus);
1823 if (ApiStatus == ERROR_NONE_MAPPED)
1824 ApiStatus = NERR_GroupNotFound;
1825 goto done;
1826 }
1827 }
1828
1829 switch (level)
1830 {
1831 case 0:
1832 /* Set the alias name */
1833 RtlInitUnicodeString(&AliasNameInfo.Name,
1834 ((PLOCALGROUP_INFO_0)buf)->lgrpi0_name);
1835
1836 Status = SamSetInformationAlias(AliasHandle,
1838 &AliasNameInfo);
1839 if (!NT_SUCCESS(Status))
1840 {
1841 TRACE("SamSetInformationAlias failed (ApiStatus %lu)\n", ApiStatus);
1842 ApiStatus = NetpNtStatusToApiStatus(Status);
1843 goto done;
1844 }
1845 break;
1846
1847 case 1:
1848 case 1002:
1849 /* Set the alias admin comment */
1850 if (level == 1)
1851 RtlInitUnicodeString(&AdminCommentInfo.AdminComment,
1852 ((PLOCALGROUP_INFO_1)buf)->lgrpi1_comment);
1853 else
1854 RtlInitUnicodeString(&AdminCommentInfo.AdminComment,
1855 ((PLOCALGROUP_INFO_1002)buf)->lgrpi1002_comment);
1856
1857 Status = SamSetInformationAlias(AliasHandle,
1859 &AdminCommentInfo);
1860 if (!NT_SUCCESS(Status))
1861 {
1862 TRACE("SamSetInformationAlias failed (ApiStatus %lu)\n", ApiStatus);
1863 ApiStatus = NetpNtStatusToApiStatus(Status);
1864 goto done;
1865 }
1866 break;
1867
1868 default:
1869 ApiStatus = ERROR_INVALID_LEVEL;
1870 goto done;
1871 }
1872
1873done:
1874 if (AliasHandle != NULL)
1875 SamCloseHandle(AliasHandle);
1876
1877 if (DomainHandle != NULL)
1878 SamCloseHandle(DomainHandle);
1879
1880 if (ServerHandle != NULL)
1881 SamCloseHandle(ServerHandle);
1882
1883 return ApiStatus;
1884}
1885
1886
1887/************************************************************
1888 * NetLocalGroupSetMember (NETAPI32.@)
1889 */
1891WINAPI
1893 LPCWSTR servername,
1894 LPCWSTR groupname,
1895 DWORD level,
1896 LPBYTE buf,
1897 DWORD totalentries)
1898{
1899 FIXME("(%s %s %d %p %d) stub!\n", debugstr_w(servername),
1900 debugstr_w(groupname), level, buf, totalentries);
1901 return NERR_Success;
1902}
1903
1904/* EOF */
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
LONG NTSTATUS
Definition: precomp.h:26
HANDLE LsaHandle
Definition: wkssvc.c:41
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
ULONG_PTR * PDWORD_PTR
Definition: basetsd.h:176
Definition: bufpool.h:45
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
NTSTATUS WINAPI LsaOpenPolicy(IN PLSA_UNICODE_STRING SystemName OPTIONAL, IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE PolicyHandle)
Definition: lsa.c:1183
NTSTATUS WINAPI LsaLookupSids(IN LSA_HANDLE PolicyHandle, IN ULONG Count, IN PSID *Sids, OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, OUT PLSA_TRANSLATED_NAME *Names)
Definition: lsa.c:1069
NTSTATUS WINAPI LsaFreeMemory(IN PVOID Buffer)
Definition: lsa.c:701
NTSTATUS WINAPI LsaLookupNames(IN LSA_HANDLE PolicyHandle, IN ULONG Count, IN PLSA_UNICODE_STRING Names, OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, OUT PLSA_TRANSLATED_SID *Sids)
Definition: lsa.c:855
NTSTATUS WINAPI LsaClose(IN LSA_HANDLE ObjectHandle)
Definition: lsa.c:194
NET_API_STATUS WINAPI NetApiBufferFree(LPVOID Buffer)
Definition: apibuf.c:43
NET_API_STATUS WINAPI NetApiBufferAllocate(DWORD ByteCount, LPVOID *Buffer)
Definition: apibuf.c:28
NET_API_STATUS WINAPI NetpNtStatusToApiStatus(_In_ NTSTATUS Status)
Definition: misc.c:289
#define L(x)
Definition: resources.c:13
unsigned long DWORD
Definition: ntddk_ex.h:95
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
Status
Definition: gdiplustypes.h:24
GLint level
Definition: gl.h:1546
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
enum _ENUM_PHASE ENUM_PHASE
_ENUM_PHASE
Definition: group_new.c:15
#define debugstr_w
Definition: kernel32.h:32
struct _LOCALGROUP_INFO_1 LOCALGROUP_INFO_1
struct _LOCALGROUP_INFO_1 * PLOCALGROUP_INFO_1
struct _LOCALGROUP_MEMBERS_INFO_2 LOCALGROUP_MEMBERS_INFO_2
struct _LOCALGROUP_MEMBERS_INFO_0 * PLOCALGROUP_MEMBERS_INFO_0
struct _LOCALGROUP_MEMBERS_INFO_2 * PLOCALGROUP_MEMBERS_INFO_2
struct _LOCALGROUP_MEMBERS_INFO_1 * PLOCALGROUP_MEMBERS_INFO_1
struct _LOCALGROUP_MEMBERS_INFO_3 * PLOCALGROUP_MEMBERS_INFO_3
struct _LOCALGROUP_INFO_0 * PLOCALGROUP_INFO_0
struct _LOCALGROUP_INFO_0 LOCALGROUP_INFO_0
struct _LOCALGROUP_MEMBERS_INFO_1 LOCALGROUP_MEMBERS_INFO_1
struct _LOCALGROUP_MEMBERS_INFO_3 LOCALGROUP_MEMBERS_INFO_3
struct _LOCALGROUP_MEMBERS_INFO_0 LOCALGROUP_MEMBERS_INFO_0
#define PARM_ERROR_NONE
Definition: lmcons.h:56
#define NERR_Success
Definition: lmerr.h:5
#define NERR_BufTooSmall
Definition: lmerr.h:21
#define NERR_GroupNotFound
Definition: lmerr.h:87
NET_API_STATUS WINAPI NetLocalGroupSetMembers(LPCWSTR servername, LPCWSTR groupname, DWORD level, LPBYTE buf, DWORD totalentries)
Definition: local_group.c:1892
NET_API_STATUS WINAPI NetLocalGroupDelMembers(LPCWSTR servername, LPCWSTR groupname, DWORD level, LPBYTE buf, DWORD totalentries)
Definition: local_group.c:819
enum _ENUM_PHASE ENUM_PHASE
static VOID FreeAliasInfo(PALIAS_GENERAL_INFORMATION AliasInfo)
Definition: local_group.c:153
NET_API_STATUS WINAPI NetLocalGroupGetMembers(LPCWSTR servername, LPCWSTR localgroupname, DWORD level, LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, PDWORD_PTR resumehandle)
Definition: local_group.c:1358
NET_API_STATUS WINAPI NetLocalGroupSetInfo(LPCWSTR servername, LPCWSTR groupname, DWORD level, LPBYTE buf, LPDWORD parm_err)
Definition: local_group.c:1736
NET_API_STATUS WINAPI NetLocalGroupEnum(LPCWSTR servername, DWORD level, LPBYTE *bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, PDWORD_PTR resumehandle)
Definition: local_group.c:978
NET_API_STATUS WINAPI NetLocalGroupGetInfo(LPCWSTR servername, LPCWSTR groupname, DWORD level, LPBYTE *bufptr)
Definition: local_group.c:1229
struct _ENUM_CONTEXT * PENUM_CONTEXT
static NET_API_STATUS OpenAliasByName(SAM_HANDLE DomainHandle, PUNICODE_STRING AliasName, ULONG DesiredAccess, PSAM_HANDLE AliasHandle)
Definition: local_group.c:167
NET_API_STATUS WINAPI NetLocalGroupAdd(LPCWSTR servername, DWORD level, LPBYTE buf, LPDWORD parm_err)
Definition: local_group.c:334
NET_API_STATUS WINAPI NetLocalGroupDelMember(LPCWSTR servername, LPCWSTR groupname, PSID membersid)
Definition: local_group.c:794
struct _MEMBER_ENUM_CONTEXT * PMEMBER_ENUM_CONTEXT
NET_API_STATUS WINAPI NetLocalGroupDel(LPCWSTR servername, LPCWSTR groupname)
Definition: local_group.c:679
@ AccountPhase
Definition: local_group.c:28
@ DonePhase
Definition: local_group.c:29
@ BuiltinPhase
Definition: local_group.c:27
static NET_API_STATUS BuildAliasInfoBuffer(PALIAS_GENERAL_INFORMATION AliasInfo, DWORD level, LPVOID *Buffer)
Definition: local_group.c:64
NET_API_STATUS WINAPI NetLocalGroupAddMember(LPCWSTR servername, LPCWSTR groupname, PSID membersid)
Definition: local_group.c:495
struct _ENUM_CONTEXT ENUM_CONTEXT
NET_API_STATUS WINAPI NetLocalGroupAddMembers(LPCWSTR servername, LPCWSTR groupname, DWORD level, LPBYTE buf, DWORD totalentries)
Definition: local_group.c:520
struct _MEMBER_ENUM_CONTEXT MEMBER_ENUM_CONTEXT
static NET_API_STATUS BuildSidListFromDomainAndName(IN PUNICODE_STRING ServerName, IN PLOCALGROUP_MEMBERS_INFO_3 buf, IN ULONG EntryCount, OUT PLOCALGROUP_MEMBERS_INFO_0 *MemberList)
Definition: local_group.c:222
enum _SID_NAME_USE * PSID_NAME_USE
@ SidTypeAlias
Definition: lsa.idl:121
#define ZeroMemory
Definition: minwinbase.h:31
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:115
struct _SID * PSID
Definition: eventlog.c:37
DWORD NET_API_STATUS
Definition: ms-dtyp.idl:91
NTSYSAPI ULONG NTAPI RtlLengthSid(IN PSID Sid)
Definition: sid.c:150
NTSTATUS OpenBuiltinDomain(IN SAM_HANDLE ServerHandle, IN ULONG DesiredAccess, OUT SAM_HANDLE *DomainHandle)
NET_API_STATUS BuildSidFromSidAndRid(IN PSID SrcSid, IN ULONG RelativeId, OUT PSID *DestSid)
Definition: utils.c:177
NTSTATUS OpenAccountDomain(IN SAM_HANDLE ServerHandle, IN PUNICODE_STRING ServerName, IN ULONG DesiredAccess, OUT PSAM_HANDLE DomainHandle)
Definition: utils.c:113
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define DELETE
Definition: nt_native.h:57
#define UNICODE_NULL
@ AliasGeneralInformation
Definition: ntsam.h:279
@ AliasAdminCommentInformation
Definition: ntsam.h:281
@ AliasNameInformation
Definition: ntsam.h:280
#define DOMAIN_LOOKUP
Definition: ntsam.h:42
ULONG SAM_ENUMERATE_HANDLE
Definition: ntsam.h:263
#define DOMAIN_CREATE_ALIAS
Definition: ntsam.h:39
#define SAM_SERVER_LOOKUP_DOMAIN
Definition: ntsam.h:104
#define ALIAS_WRITE_ACCOUNT
Definition: ntsam.h:13
#define SAM_SERVER_CONNECT
Definition: ntsam.h:99
#define ALIAS_LIST_MEMBERS
Definition: ntsam.h:11
#define ALIAS_READ_INFORMATION
Definition: ntsam.h:12
#define ALIAS_REMOVE_MEMBER
Definition: ntsam.h:10
#define DOMAIN_LIST_ACCOUNTS
Definition: ntsam.h:41
#define ALIAS_ADD_MEMBER
Definition: ntsam.h:9
short WCHAR
Definition: pedump.c:58
#define POLICY_EXECUTE
Definition: ntsecapi.h:76
NTSTATUS NTAPI SamAddMemberToAlias(IN SAM_HANDLE AliasHandle, IN PSID MemberId)
Definition: samlib.c:235
NTSTATUS NTAPI SamSetInformationAlias(IN SAM_HANDLE AliasHandle, IN ALIAS_INFORMATION_CLASS AliasInformationClass, IN PVOID Buffer)
Definition: samlib.c:1919
NTSTATUS NTAPI SamOpenAlias(IN SAM_HANDLE DomainHandle, IN ACCESS_MASK DesiredAccess, IN ULONG AliasId, OUT PSAM_HANDLE AliasHandle)
Definition: samlib.c:1448
NTSTATUS NTAPI SamLookupNamesInDomain(IN SAM_HANDLE DomainHandle, IN ULONG Count, IN PUNICODE_STRING Names, OUT PULONG *RelativeIds, OUT PSID_NAME_USE *Use)
Definition: samlib.c:1371
NTSTATUS NTAPI SamDeleteAlias(IN SAM_HANDLE AliasHandle)
Definition: samlib.c:704
NTSTATUS NTAPI SamFreeMemory(IN PVOID Buffer)
Definition: samlib.c:983
NTSTATUS NTAPI SamConnect(IN OUT PUNICODE_STRING ServerName OPTIONAL, OUT PSAM_HANDLE ServerHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
Definition: samlib.c:519
NTSTATUS NTAPI SamCloseHandle(IN SAM_HANDLE SamHandle)
Definition: samlib.c:497
NTSTATUS NTAPI SamCreateAliasInDomain(IN SAM_HANDLE DomainHandle, IN PUNICODE_STRING AccountName, IN ACCESS_MASK DesiredAccess, OUT PSAM_HANDLE AliasHandle, OUT PULONG RelativeId)
Definition: samlib.c:562
NTSTATUS NTAPI SamQueryInformationAlias(IN SAM_HANDLE AliasHandle, IN ALIAS_INFORMATION_CLASS AliasInformationClass, OUT PVOID *Buffer)
Definition: samlib.c:1650
NTSTATUS NTAPI SamGetMembersInAlias(IN SAM_HANDLE AliasHandle, OUT PSID **MemberIds, OUT PULONG MemberCount)
Definition: samlib.c:1138
NTSTATUS NTAPI SamRemoveMemberFromAlias(IN SAM_HANDLE AliasHandle, IN PSID MemberId)
Definition: samlib.c:1800
NTSTATUS NTAPI SamEnumerateAliasesInDomain(IN SAM_HANDLE DomainHandle, IN OUT PSAM_ENUMERATE_HANDLE EnumerationContext, OUT PVOID *Buffer, IN ULONG PreferedMaximumLength, OUT PULONG CountReturned)
Definition: samlib.c:788
#define STATUS_SUCCESS
Definition: shellext.h:65
#define TRACE(s)
Definition: solgame.cpp:4
UNICODE_STRING AdminComment
Definition: ntsam.h:298
UNICODE_STRING AdminComment
Definition: ntsam.h:288
UNICODE_STRING Name
Definition: ntsam.h:286
UNICODE_STRING Name
Definition: ntsam.h:293
ULONG Returned
Definition: local_group.c:41
SAM_HANDLE BuiltinDomainHandle
Definition: local_group.c:36
ENUM_PHASE Phase
Definition: local_group.c:43
SAM_HANDLE AccountDomainHandle
Definition: local_group.c:37
SAM_HANDLE ServerHandle
Definition: local_group.c:34
SAM_ENUMERATE_HANDLE EnumerationContext
Definition: local_group.c:39
PSAM_RID_ENUMERATION Buffer
Definition: local_group.c:40
SAM_HANDLE DomainHandle
Definition: local_group.c:35
LPWSTR lgrpi0_name
Definition: lmaccess.h:506
LPWSTR lgrpi1_comment
Definition: lmaccess.h:510
LPWSTR lgrpi1_name
Definition: lmaccess.h:509
SID_NAME_USE lgrmi1_sidusage
Definition: lmaccess.h:520
SID_NAME_USE lgrmi2_sidusage
Definition: lmaccess.h:525
PLSA_TRUST_INFORMATION Domains
Definition: ntsecapi.h:408
LSA_UNICODE_STRING Name
Definition: ntsecapi.h:423
SID_NAME_USE Use
Definition: ntsecapi.h:422
LSA_UNICODE_STRING Name
Definition: ntsecapi.h:403
PLSA_REFERENCED_DOMAIN_LIST Domains
Definition: local_group.c:56
SAM_HANDLE DomainHandle
Definition: local_group.c:50
SAM_HANDLE ServerHandle
Definition: local_group.c:49
SAM_HANDLE AliasHandle
Definition: local_group.c:51
LSA_HANDLE LsaHandle
Definition: local_group.c:52
PLSA_TRANSLATED_NAME Names
Definition: local_group.c:57
UNICODE_STRING Name
Definition: ntsam.h:268
static unsigned int bufptr
Definition: tncon.cpp:77
#define DWORD_PTR
Definition: treelist.c:76
uint32_t * PULONG
Definition: typedefs.h:59
const uint16_t * LPCWSTR
Definition: typedefs.h:57
unsigned char * LPBYTE
Definition: typedefs.h:53
uint16_t * LPWSTR
Definition: typedefs.h:56
void * PVOID
Definition: typedefs.h:50
uint32_t * LPDWORD
Definition: typedefs.h:59
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_MORE_ENTRIES
Definition: udferr_usr.h:124
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
Definition: wdfdevice.h:2664
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
#define WINAPI
Definition: msvc.h:6
#define ERROR_INVALID_LEVEL
Definition: winerror.h:318
#define ERROR_ALIAS_EXISTS
Definition: winerror.h:1205
#define ERROR_NONE_MAPPED
Definition: winerror.h:1159