2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS net command
7 * PROGRAMMERS: Eric Kohl
15 CompareInfo(const void *a
,
18 return _wcsicmp(((PLOCALGROUP_INFO_0
)a
)->lgrpi0_name
,
19 ((PLOCALGROUP_INFO_0
)b
)->lgrpi0_name
);
25 EnumerateLocalGroups(VOID
)
27 PLOCALGROUP_INFO_0 pBuffer
= NULL
;
28 PSERVER_INFO_100 pServer
= NULL
;
29 DWORD dwRead
= 0, dwTotal
= 0;
31 DWORD_PTR ResumeHandle
= 0;
32 NET_API_STATUS Status
;
35 Status
= NetServerGetInfo(NULL
,
38 if (Status
!= NERR_Success
)
41 printf("\nAliases for \\\\%S\n\n", pServer
->sv100_name
);
42 printf("------------------------------------------\n");
44 NetApiBufferFree(pServer
);
46 Status
= NetLocalGroupEnum(NULL
,
53 if (Status
!= NERR_Success
)
58 sizeof(PLOCALGROUP_INFO_0
),
61 // printf("dwRead: %lu dwTotal: %lu\n", dwRead, dwTotal);
62 for (i
= 0; i
< dwRead
; i
++)
64 // printf("%p\n", pBuffer[i].lgrpi0_name);
65 if (pBuffer
[i
].lgrpi0_name
)
66 printf("*%S\n", pBuffer
[i
].lgrpi0_name
);
69 NetApiBufferFree(pBuffer
);
77 DisplayLocalGroup(LPWSTR lpGroupName
)
79 PLOCALGROUP_INFO_1 pGroupInfo
= NULL
;
80 PLOCALGROUP_MEMBERS_INFO_3 pMembers
= NULL
;
81 PSERVER_INFO_100 pServer
= NULL
;
82 LPWSTR
*pNames
= NULL
;
85 DWORD_PTR ResumeHandle
= 0;
88 NET_API_STATUS Status
;
90 Status
= NetLocalGroupGetInfo(NULL
,
93 (LPBYTE
*)&pGroupInfo
);
94 if (Status
!= NERR_Success
)
97 Status
= NetLocalGroupGetMembers(NULL
,
101 MAX_PREFERRED_LENGTH
,
105 if (Status
!= NERR_Success
)
108 Status
= NetServerGetInfo(NULL
,
111 if (Status
!= NERR_Success
)
114 pNames
= RtlAllocateHeap(RtlGetProcessHeap(),
116 dwRead
* sizeof(LPWSTR
));
119 Status
= ERROR_OUTOFMEMORY
;
123 len
= wcslen(pServer
->sv100_name
);
124 for (i
= 0; i
< dwRead
; i
++)
126 if (!wcsncmp(pMembers
[i
].lgrmi3_domainandname
, pServer
->sv100_name
, len
))
127 pNames
[i
] = &pMembers
[i
].lgrmi3_domainandname
[len
+ 1];
129 pNames
[i
] = pMembers
[i
].lgrmi3_domainandname
;
132 printf("Alias name %S\n", pGroupInfo
->lgrpi1_name
);
133 printf("Comment %S\n", pGroupInfo
->lgrpi1_comment
);
137 printf("------------------------------------------\n");
139 for (i
= 0; i
< dwRead
; i
++)
142 printf("%S\n", pNames
[i
]);
147 RtlFreeHeap(RtlGetProcessHeap(), 0, pNames
);
150 NetApiBufferFree(pServer
);
152 if (pMembers
!= NULL
)
153 NetApiBufferFree(pMembers
);
155 if (pGroupInfo
!= NULL
)
156 NetApiBufferFree(pGroupInfo
);
169 ULONG dwMemberCount
= 0;
171 BOOL bDelete
= FALSE
;
173 BOOL bDomain
= FALSE
;
175 LPWSTR lpGroupName
= NULL
;
176 LPWSTR lpComment
= NULL
;
177 LPLOCALGROUP_MEMBERS_INFO_3 lpMembers
= NULL
;
178 LOCALGROUP_INFO_0 Info0
;
179 LOCALGROUP_INFO_1 Info1
;
180 LOCALGROUP_INFO_1002 Info1002
;
181 NET_API_STATUS Status
;
185 Status
= EnumerateLocalGroups();
186 printf("Status: %lu\n", Status
);
191 Status
= DisplayLocalGroup(argv
[2]);
192 printf("Status: %lu\n", Status
);
197 if (argv
[i
][0] != L
'/')
199 lpGroupName
= argv
[i
];
203 for (j
= i
; j
< argc
; j
++)
205 if (argv
[j
][0] == L
'/')
211 printf("Member count: %lu\n", dwMemberCount
);
213 if (dwMemberCount
> 0)
215 lpMembers
= RtlAllocateHeap(RtlGetProcessHeap(),
217 dwMemberCount
* sizeof(LPLOCALGROUP_MEMBERS_INFO_3
));
218 if (lpMembers
== NULL
)
223 for (; i
< argc
; i
++)
225 if (argv
[i
][0] == L
'/')
228 lpMembers
[j
].lgrmi3_domainandname
= argv
[i
];
232 for (; i
< argc
; i
++)
234 if (_wcsicmp(argv
[i
], L
"/help") == 0)
236 PrintResourceString(IDS_LOCALGROUP_HELP
);
239 else if (_wcsicmp(argv
[i
], L
"/add") == 0)
243 else if (_wcsicmp(argv
[i
], L
"/delete") == 0)
247 else if (_wcsnicmp(argv
[i
], L
"/comment:", 9) == 0)
249 lpComment
= &argv
[i
][9];
251 else if (_wcsicmp(argv
[i
], L
"/domain") == 0)
253 printf("The /DOMAIN option is not supported yet!\n");
265 if (lpGroupName
== NULL
)
278 printf("Group:\n %S\n", lpGroupName
);
280 if (lpMembers
!= NULL
)
282 printf("\nMembers:\n");
283 for (i
= 0; i
< dwMemberCount
; i
++)
284 printf(" %S\n", lpMembers
[i
].lgrmi3_domainandname
);
287 if (lpComment
!= NULL
)
289 printf("\nComment:\n %S\n", lpComment
);
293 if (lpMembers
== NULL
)
295 if (!bAdd
&& !bDelete
&& lpComment
!= NULL
)
297 /* Set group comment */
298 Info1002
.lgrpi1002_comment
= lpComment
;
299 Status
= NetLocalGroupSetInfo(NULL
,
304 printf("Status: %lu\n", Status
);
306 else if (bAdd
&& !bDelete
)
309 if (lpComment
== NULL
)
311 Info0
.lgrpi0_name
= lpGroupName
;
315 Info1
.lgrpi1_name
= lpGroupName
;
316 Info1
.lgrpi1_comment
= lpComment
;
319 Status
= NetLocalGroupAdd(NULL
,
320 (lpComment
== NULL
) ? 0 : 1,
321 (lpComment
== NULL
) ? (LPBYTE
)&Info0
: (LPBYTE
)&Info1
,
323 printf("Status: %lu\n", Status
);
325 else if (!bAdd
&& bDelete
&& lpComment
== NULL
)
327 /* Delete the group */
328 Status
= NetLocalGroupDel(NULL
,
330 printf("Status: %lu\n", Status
);
339 if (bAdd
&& !bDelete
&& lpComment
== NULL
)
341 /* Add group members */
342 Status
= NetLocalGroupAddMembers(NULL
,
347 printf("Status: %lu\n", Status
);
349 else if (!bAdd
&& bDelete
&& lpComment
== NULL
)
351 /* Delete group members */
352 Status
= NetLocalGroupDelMembers(NULL
,
357 printf("Status: %lu\n", Status
);
366 if (lpMembers
!= NULL
)
367 RtlFreeHeap(RtlGetProcessHeap(), 0, lpMembers
);
370 PrintResourceString(IDS_LOCALGROUP_SYNTAX
);