2 * Copyright 2006 Robert Reif
4 * netapi32 local group functions
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.
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.
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
23 WINE_DEFAULT_DEBUG_CHANNEL(netapi32
);
26 typedef enum _ENUM_PHASE
33 typedef struct _ENUM_CONTEXT
35 SAM_HANDLE ServerHandle
;
36 SAM_HANDLE DomainHandle
;
37 SAM_HANDLE BuiltinDomainHandle
;
38 SAM_HANDLE AccountDomainHandle
;
40 SAM_ENUMERATE_HANDLE EnumerationContext
;
41 PSAM_RID_ENUMERATION Buffer
;
46 } ENUM_CONTEXT
, *PENUM_CONTEXT
;
51 BuildAliasInfoBuffer(PALIAS_GENERAL_INFORMATION AliasInfo
,
55 LPVOID LocalBuffer
= NULL
;
56 PLOCALGROUP_INFO_0 LocalInfo0
;
57 PLOCALGROUP_INFO_1 LocalInfo1
;
60 NET_API_STATUS ApiStatus
= NERR_Success
;
67 Size
= sizeof(LOCALGROUP_INFO_0
) +
68 AliasInfo
->Name
.Length
+ sizeof(WCHAR
);
72 Size
= sizeof(LOCALGROUP_INFO_1
) +
73 AliasInfo
->Name
.Length
+ sizeof(WCHAR
) +
74 AliasInfo
->AdminComment
.Length
+ sizeof(WCHAR
);
78 ApiStatus
= ERROR_INVALID_LEVEL
;
82 ApiStatus
= NetApiBufferAllocate(Size
, &LocalBuffer
);
83 if (ApiStatus
!= NERR_Success
)
86 ZeroMemory(LocalBuffer
, Size
);
91 LocalInfo0
= (PLOCALGROUP_INFO_0
)LocalBuffer
;
93 Ptr
= (LPWSTR
)LocalInfo0
++;
94 LocalInfo0
->lgrpi0_name
= Ptr
;
96 memcpy(LocalInfo0
->lgrpi0_name
,
97 AliasInfo
->Name
.Buffer
,
98 AliasInfo
->Name
.Length
);
99 LocalInfo0
->lgrpi0_name
[AliasInfo
->Name
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
103 LocalInfo1
= (PLOCALGROUP_INFO_1
)LocalBuffer
;
105 Ptr
= (LPWSTR
)((ULONG_PTR
)LocalInfo1
+ sizeof(LOCALGROUP_INFO_1
));
106 LocalInfo1
->lgrpi1_name
= Ptr
;
108 memcpy(LocalInfo1
->lgrpi1_name
,
109 AliasInfo
->Name
.Buffer
,
110 AliasInfo
->Name
.Length
);
111 LocalInfo1
->lgrpi1_name
[AliasInfo
->Name
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
113 Ptr
= (LPWSTR
)((ULONG_PTR
)Ptr
+ AliasInfo
->Name
.Length
+ sizeof(WCHAR
));
114 LocalInfo1
->lgrpi1_comment
= Ptr
;
116 memcpy(LocalInfo1
->lgrpi1_comment
,
117 AliasInfo
->AdminComment
.Buffer
,
118 AliasInfo
->AdminComment
.Length
);
119 LocalInfo1
->lgrpi1_comment
[AliasInfo
->AdminComment
.Length
/ sizeof(WCHAR
)] = UNICODE_NULL
;
124 if (ApiStatus
== NERR_Success
)
126 *Buffer
= LocalBuffer
;
130 if (LocalBuffer
!= NULL
)
131 NetApiBufferFree(LocalBuffer
);
140 FreeAliasInfo(PALIAS_GENERAL_INFORMATION AliasInfo
)
142 if (AliasInfo
->Name
.Buffer
!= NULL
)
143 SamFreeMemory(AliasInfo
->Name
.Buffer
);
145 if (AliasInfo
->AdminComment
.Buffer
!= NULL
)
146 SamFreeMemory(AliasInfo
->AdminComment
.Buffer
);
148 SamFreeMemory(AliasInfo
);
154 OpenAliasByName(SAM_HANDLE DomainHandle
,
155 PUNICODE_STRING AliasName
,
157 PSAM_HANDLE AliasHandle
)
159 PULONG RelativeIds
= NULL
;
160 PSID_NAME_USE Use
= NULL
;
161 NET_API_STATUS ApiStatus
= NERR_Success
;
162 NTSTATUS Status
= STATUS_SUCCESS
;
164 /* Get the RID for the given user name */
165 Status
= SamLookupNamesInDomain(DomainHandle
,
170 if (!NT_SUCCESS(Status
))
172 ERR("SamLookupNamesInDomain failed (Status %08lx)\n", Status
);
173 return NetpNtStatusToApiStatus(Status
);
176 /* Fail, if it is not an alias account */
177 if (Use
[0] != SidTypeAlias
)
179 ERR("Object is not an Alias!\n");
180 ApiStatus
= NERR_GroupNotFound
;
184 /* Open the alias account */
185 Status
= SamOpenAlias(DomainHandle
,
189 if (!NT_SUCCESS(Status
))
191 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);
192 ApiStatus
= NetpNtStatusToApiStatus(Status
);
197 if (RelativeIds
!= NULL
)
198 SamFreeMemory(RelativeIds
);
207 /************************************************************
208 * NetLocalGroupAdd (NETAPI32.@)
218 ALIAS_ADM_COMMENT_INFORMATION AdminComment
;
219 UNICODE_STRING ServerName
;
220 UNICODE_STRING AliasName
;
221 SAM_HANDLE ServerHandle
= NULL
;
222 SAM_HANDLE DomainHandle
= NULL
;
223 SAM_HANDLE AliasHandle
= NULL
;
224 LPWSTR aliasname
= NULL
;
225 LPWSTR aliascomment
= NULL
;
227 NET_API_STATUS ApiStatus
= NERR_Success
;
228 NTSTATUS Status
= STATUS_SUCCESS
;
230 TRACE("(%s %d %p %p) stub!\n", debugstr_w(servername
), level
, buf
,
233 /* Initialize the Server name*/
234 if (servername
!= NULL
)
235 RtlInitUnicodeString(&ServerName
, servername
);
237 /* Initialize the Alias name*/
241 aliasname
= ((PLOCALGROUP_INFO_0
)buf
)->lgrpi0_name
;
246 aliasname
= ((PLOCALGROUP_INFO_1
)buf
)->lgrpi1_name
;
247 aliascomment
= ((PLOCALGROUP_INFO_1
)buf
)->lgrpi1_comment
;
251 return ERROR_INVALID_LEVEL
;
254 RtlInitUnicodeString(&AliasName
, aliasname
);
256 /* Connect to the SAM Server */
257 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
259 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
261 if (!NT_SUCCESS(Status
))
263 ERR("SamConnect failed (Status %08lx)\n", Status
);
264 ApiStatus
= NetpNtStatusToApiStatus(Status
);
268 /* Open the Builtin Domain */
269 Status
= OpenBuiltinDomain(ServerHandle
,
272 if (!NT_SUCCESS(Status
))
274 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
275 ApiStatus
= NetpNtStatusToApiStatus(Status
);
279 /* Try to open the Alias Account in the Builtin Domain */
280 ApiStatus
= OpenAliasByName(DomainHandle
,
282 ALIAS_READ_INFORMATION
,
284 if (ApiStatus
== NERR_Success
)
286 ERR("OpenAliasByName: alias %wZ already exists!\n", &AliasName
);
288 SamCloseHandle(AliasHandle
);
289 ApiStatus
= ERROR_ALIAS_EXISTS
;
293 ApiStatus
= NERR_Success
;
295 /* Close the Builtin Domain */
296 SamCloseHandle(DomainHandle
);
299 /* Open the account domain */
300 Status
= OpenAccountDomain(ServerHandle
,
301 (servername
!= NULL
) ? &ServerName
: NULL
,
302 DOMAIN_CREATE_ALIAS
| DOMAIN_LOOKUP
,
304 if (!NT_SUCCESS(Status
))
306 ERR("SamOpenDomain failed (Status %08lx)\n", Status
);
307 ApiStatus
= NetpNtStatusToApiStatus(Status
);
311 /* Create the alias */
312 Status
= SamCreateAliasInDomain(DomainHandle
,
314 DELETE
| ALIAS_WRITE_ACCOUNT
,
317 if (!NT_SUCCESS(Status
))
319 ERR("SamCreateAliasInDomain failed (Status %08lx)\n", Status
);
320 ApiStatus
= NetpNtStatusToApiStatus(Status
);
324 TRACE("Created alias \"%wZ\" (RID: %lu)\n", &AliasName
, RelativeId
);
326 /* Set the admin comment */
329 RtlInitUnicodeString(&AdminComment
.AdminComment
, aliascomment
);
331 Status
= SamSetInformationAlias(AliasHandle
,
332 AliasAdminCommentInformation
,
334 if (!NT_SUCCESS(Status
))
336 ERR("SamSetInformationAlias failed (Status %08lx)\n", Status
);
337 ApiStatus
= NetpNtStatusToApiStatus(Status
);
339 /* Delete the Alias if the Comment could not be set */
340 SamDeleteAlias(AliasHandle
);
347 if (AliasHandle
!= NULL
)
348 SamCloseHandle(AliasHandle
);
350 if (DomainHandle
!= NULL
)
351 SamCloseHandle(DomainHandle
);
353 if (ServerHandle
!= NULL
)
354 SamCloseHandle(ServerHandle
);
360 /************************************************************
361 * NetLocalGroupAddMember (NETAPI32.@)
363 NET_API_STATUS WINAPI
NetLocalGroupAddMember(
368 FIXME("(%s %s %p) stub!\n", debugstr_w(servername
),
369 debugstr_w(groupname
), membersid
);
373 /************************************************************
374 * NetLocalGroupAddMembers (NETAPI32.@)
376 NET_API_STATUS WINAPI
NetLocalGroupAddMembers(
383 FIXME("(%s %s %d %p %d) stub!\n", debugstr_w(servername
),
384 debugstr_w(groupname
), level
, buf
, totalentries
);
389 /************************************************************
390 * NetLocalGroupDel (NETAPI32.@)
398 UNICODE_STRING ServerName
;
399 UNICODE_STRING GroupName
;
400 SAM_HANDLE ServerHandle
= NULL
;
401 SAM_HANDLE DomainHandle
= NULL
;
402 SAM_HANDLE AliasHandle
= NULL
;
403 NET_API_STATUS ApiStatus
= NERR_Success
;
404 NTSTATUS Status
= STATUS_SUCCESS
;
406 TRACE("(%s %s)\n", debugstr_w(servername
), debugstr_w(groupname
));
408 if (servername
!= NULL
)
409 RtlInitUnicodeString(&ServerName
, servername
);
411 RtlInitUnicodeString(&GroupName
, groupname
);
413 /* Connect to the SAM Server */
414 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
416 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
418 if (!NT_SUCCESS(Status
))
420 ERR("SamConnect failed (Status %08lx)\n", Status
);
421 ApiStatus
= NetpNtStatusToApiStatus(Status
);
425 /* Open the Builtin Domain */
426 Status
= OpenBuiltinDomain(ServerHandle
,
429 if (!NT_SUCCESS(Status
))
431 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
432 ApiStatus
= NetpNtStatusToApiStatus(Status
);
436 /* Open the alias account in the builtin domain */
437 ApiStatus
= OpenAliasByName(DomainHandle
,
441 if (ApiStatus
!= NERR_Success
&& ApiStatus
!= ERROR_NONE_MAPPED
)
443 TRACE("OpenAliasByName failed (ApiStatus %lu)\n", ApiStatus
);
447 if (AliasHandle
== NULL
)
449 if (DomainHandle
!= NULL
)
451 SamCloseHandle(DomainHandle
);
455 /* Open the Acount Domain */
456 Status
= OpenAccountDomain(ServerHandle
,
457 (servername
!= NULL
) ? &ServerName
: NULL
,
460 if (!NT_SUCCESS(Status
))
462 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
463 ApiStatus
= NetpNtStatusToApiStatus(Status
);
467 /* Open the alias account in the account domain */
468 ApiStatus
= OpenAliasByName(DomainHandle
,
472 if (ApiStatus
!= NERR_Success
)
474 ERR("OpenAliasByName failed (ApiStatus %lu)\n", ApiStatus
);
475 if (ApiStatus
== ERROR_NONE_MAPPED
)
476 ApiStatus
= NERR_GroupNotFound
;
481 /* Delete the alias */
482 Status
= SamDeleteAlias(AliasHandle
);
483 if (!NT_SUCCESS(Status
))
485 ERR("SamDeleteAlias failed (Status %08lx)\n", Status
);
486 ApiStatus
= NetpNtStatusToApiStatus(Status
);
491 if (AliasHandle
!= NULL
)
492 SamCloseHandle(AliasHandle
);
494 if (DomainHandle
!= NULL
)
495 SamCloseHandle(DomainHandle
);
497 if (ServerHandle
!= NULL
)
498 SamCloseHandle(ServerHandle
);
504 /************************************************************
505 * NetLocalGroupDelMember (NETAPI32.@)
507 NET_API_STATUS WINAPI
NetLocalGroupDelMember(
512 FIXME("(%s %s %p) stub!\n", debugstr_w(servername
),
513 debugstr_w(groupname
), membersid
);
517 /************************************************************
518 * NetLocalGroupDelMembers (NETAPI32.@)
520 NET_API_STATUS WINAPI
NetLocalGroupDelMembers(
527 FIXME("(%s %s %d %p %d) stub!\n", debugstr_w(servername
),
528 debugstr_w(groupname
), level
, buf
, totalentries
);
533 /************************************************************
534 * NetLocalGroupEnum (NETAPI32.@)
544 LPDWORD totalentries
,
545 PDWORD_PTR resumehandle
)
547 UNICODE_STRING ServerName
;
548 PSAM_RID_ENUMERATION CurrentAlias
;
549 PENUM_CONTEXT EnumContext
= NULL
;
551 SAM_HANDLE AliasHandle
= NULL
;
552 PALIAS_GENERAL_INFORMATION AliasInfo
= NULL
;
553 LPVOID Buffer
= NULL
;
554 NET_API_STATUS ApiStatus
= NERR_Success
;
555 NTSTATUS Status
= STATUS_SUCCESS
;
557 TRACE("(%s %d %p %d %p %p %p) stub!\n", debugstr_w(servername
),
558 level
, bufptr
, prefmaxlen
, entriesread
, totalentries
, resumehandle
);
564 if (servername
!= NULL
)
565 RtlInitUnicodeString(&ServerName
, servername
);
567 if (resumehandle
!= NULL
&& *resumehandle
!= 0)
569 EnumContext
= (PENUM_CONTEXT
)*resumehandle
;
573 ApiStatus
= NetApiBufferAllocate(sizeof(ENUM_CONTEXT
), (PVOID
*)&EnumContext
);
574 if (ApiStatus
!= NERR_Success
)
577 EnumContext
->EnumerationContext
= 0;
578 EnumContext
->Buffer
= NULL
;
579 EnumContext
->Returned
= 0;
580 EnumContext
->Index
= 0;
582 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
583 &EnumContext
->ServerHandle
,
584 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
586 if (!NT_SUCCESS(Status
))
588 ERR("SamConnect failed (Status %08lx)\n", Status
);
589 ApiStatus
= NetpNtStatusToApiStatus(Status
);
593 Status
= OpenAccountDomain(EnumContext
->ServerHandle
,
594 (servername
!= NULL
) ? &ServerName
: NULL
,
595 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
596 &EnumContext
->AccountDomainHandle
);
597 if (!NT_SUCCESS(Status
))
599 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
600 ApiStatus
= NetpNtStatusToApiStatus(Status
);
604 Status
= OpenBuiltinDomain(EnumContext
->ServerHandle
,
605 DOMAIN_LIST_ACCOUNTS
| DOMAIN_LOOKUP
,
606 &EnumContext
->BuiltinDomainHandle
);
607 if (!NT_SUCCESS(Status
))
609 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
610 ApiStatus
= NetpNtStatusToApiStatus(Status
);
614 EnumContext
->Phase
= BuiltinPhase
;
615 EnumContext
->DomainHandle
= EnumContext
->BuiltinDomainHandle
;
621 TRACE("EnumContext->Index: %lu\n", EnumContext
->Index
);
622 TRACE("EnumContext->Returned: %lu\n", EnumContext
->Returned
);
624 if (EnumContext
->Index
>= EnumContext
->Returned
)
626 TRACE("Calling SamEnumerateAliasesInDomain\n");
628 Status
= SamEnumerateAliasesInDomain(EnumContext
->DomainHandle
,
629 &EnumContext
->EnumerationContext
,
630 (PVOID
*)&EnumContext
->Buffer
,
632 &EnumContext
->Returned
);
634 TRACE("SamEnumerateAliasesInDomain returned (Status %08lx)\n", Status
);
635 if (!NT_SUCCESS(Status
))
637 ERR("SamEnumerateAliasesInDomain failed (Status %08lx)\n", Status
);
638 ApiStatus
= NetpNtStatusToApiStatus(Status
);
642 if (Status
== STATUS_MORE_ENTRIES
)
644 ApiStatus
= NERR_BufTooSmall
;
649 TRACE("EnumContext: %lu\n", EnumContext
);
650 TRACE("EnumContext->Returned: %lu\n", EnumContext
->Returned
);
651 TRACE("EnumContext->Buffer: %p\n", EnumContext
->Buffer
);
653 /* Get a pointer to the current alias */
654 CurrentAlias
= &EnumContext
->Buffer
[EnumContext
->Index
];
656 TRACE("RID: %lu\n", CurrentAlias
->RelativeId
);
658 Status
= SamOpenAlias(EnumContext
->DomainHandle
,
659 ALIAS_READ_INFORMATION
,
660 CurrentAlias
->RelativeId
,
662 if (!NT_SUCCESS(Status
))
664 ERR("SamOpenAlias failed (Status %08lx)\n", Status
);
665 ApiStatus
= NetpNtStatusToApiStatus(Status
);
669 Status
= SamQueryInformationAlias(AliasHandle
,
670 AliasGeneralInformation
,
671 (PVOID
*)&AliasInfo
);
672 if (!NT_SUCCESS(Status
))
674 ERR("SamQueryInformationAlias failed (Status %08lx)\n", Status
);
675 ApiStatus
= NetpNtStatusToApiStatus(Status
);
679 SamCloseHandle(AliasHandle
);
682 TRACE("Name: %S\n", AliasInfo
->Name
.Buffer
);
683 TRACE("Comment: %S\n", AliasInfo
->AdminComment
.Buffer
);
685 ApiStatus
= BuildAliasInfoBuffer(AliasInfo
,
688 if (ApiStatus
!= NERR_Success
)
691 if (AliasInfo
!= NULL
)
693 FreeAliasInfo(AliasInfo
);
697 EnumContext
->Index
++;
701 if (EnumContext
->Index
== EnumContext
->Returned
)
703 switch (EnumContext
->Phase
)
706 EnumContext
->Phase
= AccountPhase
;
707 EnumContext
->DomainHandle
= EnumContext
->AccountDomainHandle
;
708 EnumContext
->EnumerationContext
= 0;
709 EnumContext
->Index
= 0;
710 EnumContext
->Returned
= 0;
712 if (EnumContext
->Buffer
!= NULL
)
714 for (i
= 0; i
< EnumContext
->Returned
; i
++)
716 SamFreeMemory(EnumContext
->Buffer
[i
].Name
.Buffer
);
719 SamFreeMemory(EnumContext
->Buffer
);
720 EnumContext
->Buffer
= NULL
;
726 EnumContext
->Phase
= DonePhase
;
733 if (ApiStatus
== NERR_Success
&& EnumContext
->Phase
!= DonePhase
)
734 ApiStatus
= ERROR_MORE_DATA
;
736 if (EnumContext
!= NULL
)
737 *totalentries
= EnumContext
->Returned
;
739 if (resumehandle
== NULL
|| ApiStatus
!= ERROR_MORE_DATA
)
741 if (EnumContext
!= NULL
)
743 if (EnumContext
->BuiltinDomainHandle
!= NULL
)
744 SamCloseHandle(EnumContext
->BuiltinDomainHandle
);
746 if (EnumContext
->AccountDomainHandle
!= NULL
)
747 SamCloseHandle(EnumContext
->AccountDomainHandle
);
749 if (EnumContext
->ServerHandle
!= NULL
)
750 SamCloseHandle(EnumContext
->ServerHandle
);
752 if (EnumContext
->Buffer
!= NULL
)
754 for (i
= 0; i
< EnumContext
->Returned
; i
++)
756 SamFreeMemory(EnumContext
->Buffer
[i
].Name
.Buffer
);
759 SamFreeMemory(EnumContext
->Buffer
);
762 NetApiBufferFree(EnumContext
);
767 if (AliasHandle
!= NULL
)
768 SamCloseHandle(AliasHandle
);
770 if (AliasInfo
!= NULL
)
771 FreeAliasInfo(AliasInfo
);
773 if (resumehandle
!= NULL
)
774 *resumehandle
= (DWORD_PTR
)EnumContext
;
776 *bufptr
= (LPBYTE
)Buffer
;
778 TRACE ("return %lu\n", ApiStatus
);
784 /************************************************************
785 * NetLocalGroupGetInfo (NETAPI32.@)
789 NetLocalGroupGetInfo(
795 UNICODE_STRING ServerName
;
796 UNICODE_STRING GroupName
;
797 SAM_HANDLE ServerHandle
= NULL
;
798 SAM_HANDLE DomainHandle
= NULL
;
799 SAM_HANDLE AliasHandle
= NULL
;
800 PALIAS_GENERAL_INFORMATION AliasInfo
= NULL
;
801 LPVOID Buffer
= NULL
;
802 NET_API_STATUS ApiStatus
= NERR_Success
;
803 NTSTATUS Status
= STATUS_SUCCESS
;
805 TRACE("(%s %s %d %p) stub!\n", debugstr_w(servername
),
806 debugstr_w(groupname
), level
, bufptr
);
808 if (servername
!= NULL
)
809 RtlInitUnicodeString(&ServerName
, servername
);
811 RtlInitUnicodeString(&GroupName
, groupname
);
813 /* Connect to the SAM Server */
814 Status
= SamConnect((servername
!= NULL
) ? &ServerName
: NULL
,
816 SAM_SERVER_CONNECT
| SAM_SERVER_LOOKUP_DOMAIN
,
818 if (!NT_SUCCESS(Status
))
820 ERR("SamConnect failed (Status %08lx)\n", Status
);
821 ApiStatus
= NetpNtStatusToApiStatus(Status
);
825 /* Open the Builtin Domain */
826 Status
= OpenBuiltinDomain(ServerHandle
,
829 if (!NT_SUCCESS(Status
))
831 ERR("OpenBuiltinDomain failed (Status %08lx)\n", Status
);
832 ApiStatus
= NetpNtStatusToApiStatus(Status
);
836 /* Open the alias account in the builtin domain */
837 ApiStatus
= OpenAliasByName(DomainHandle
,
839 ALIAS_READ_INFORMATION
,
841 if (ApiStatus
!= NERR_Success
)
843 ERR("OpenAliasByName failed (ApiStatus %lu)\n", ApiStatus
);
847 if (AliasHandle
== NULL
)
849 if (DomainHandle
!= NULL
)
850 SamCloseHandle(DomainHandle
);
852 /* Open the Acount Domain */
853 Status
= OpenAccountDomain(ServerHandle
,
854 (servername
!= NULL
) ? &ServerName
: NULL
,
857 if (!NT_SUCCESS(Status
))
859 ERR("OpenAccountDomain failed (Status %08lx)\n", Status
);
860 ApiStatus
= NetpNtStatusToApiStatus(Status
);
864 /* Open the alias account in the account domain */
865 ApiStatus
= OpenAliasByName(DomainHandle
,
867 ALIAS_READ_INFORMATION
,
869 if (ApiStatus
!= NERR_Success
)
871 ERR("OpenAliasByName failed (ApiStatus %lu)\n", ApiStatus
);
876 Status
= SamQueryInformationAlias(AliasHandle
,
877 AliasGeneralInformation
,
878 (PVOID
*)&AliasInfo
);
879 if (!NT_SUCCESS(Status
))
881 ERR("SamQueryInformationAlias failed (Status %08lx)\n", Status
);
882 ApiStatus
= NetpNtStatusToApiStatus(Status
);
886 ApiStatus
= BuildAliasInfoBuffer(AliasInfo
,
889 if (ApiStatus
!= NERR_Success
)
893 if (AliasInfo
!= NULL
)
894 FreeAliasInfo(AliasInfo
);
896 if (AliasHandle
!= NULL
)
897 SamCloseHandle(AliasHandle
);
899 if (DomainHandle
!= NULL
)
900 SamCloseHandle(DomainHandle
);
902 if (ServerHandle
!= NULL
)
903 SamCloseHandle(ServerHandle
);
905 *bufptr
= (LPBYTE
)Buffer
;
911 /************************************************************
912 * NetLocalGroupGetMembers (NETAPI32.@)
914 NET_API_STATUS WINAPI
NetLocalGroupGetMembers(
916 LPCWSTR localgroupname
,
921 LPDWORD totalentries
,
922 PDWORD_PTR resumehandle
)
924 FIXME("(%s %s %d %p %d, %p %p %p) stub!\n", debugstr_w(servername
),
925 debugstr_w(localgroupname
), level
, bufptr
, prefmaxlen
, entriesread
,
926 totalentries
, resumehandle
);
930 WCHAR userName
[MAX_COMPUTERNAME_LENGTH
+ 1];
933 PLOCALGROUP_MEMBERS_INFO_3 ptr
;
935 /* still a stub, current user is belonging to all groups */
940 userNameLen
= MAX_COMPUTERNAME_LENGTH
+ 1;
941 GetUserNameW(userName
,&userNameLen
);
942 needlen
= sizeof(LOCALGROUP_MEMBERS_INFO_3
) +
943 (userNameLen
+2) * sizeof(WCHAR
);
944 if (prefmaxlen
!= MAX_PREFERRED_LENGTH
)
945 len
= min(prefmaxlen
,needlen
);
949 NetApiBufferAllocate(len
, (LPVOID
*) bufptr
);
951 return ERROR_MORE_DATA
;
953 ptr
= (PLOCALGROUP_MEMBERS_INFO_3
)*bufptr
;
954 ptr
->lgrmi3_domainandname
= (LPWSTR
)(*bufptr
+sizeof(LOCALGROUP_MEMBERS_INFO_3
));
955 lstrcpyW(ptr
->lgrmi3_domainandname
,userName
);
963 /************************************************************
964 * NetLocalGroupSetInfo (NETAPI32.@)
966 NET_API_STATUS WINAPI
NetLocalGroupSetInfo(
973 FIXME("(%s %s %d %p %p) stub!\n", debugstr_w(servername
),
974 debugstr_w(groupname
), level
, buf
, parm_err
);
978 /************************************************************
979 * NetLocalGroupSetMember (NETAPI32.@)
981 NET_API_STATUS WINAPI
NetLocalGroupSetMembers(
988 FIXME("(%s %s %d %p %d) stub!\n", debugstr_w(servername
),
989 debugstr_w(groupname
), level
, buf
, totalentries
);