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 PrintToConsole(L
"\n");
42 PrintResourceString(IDS_LOCALGROUP_ALIASES
, pServer
->sv100_name
);
43 PrintToConsole(L
"\n\n");
44 PrintToConsole(L
"------------------------------------------\n");
46 NetApiBufferFree(pServer
);
48 Status
= NetLocalGroupEnum(NULL
,
55 if (Status
!= NERR_Success
)
60 sizeof(PLOCALGROUP_INFO_0
),
63 for (i
= 0; i
< dwRead
; i
++)
65 if (pBuffer
[i
].lgrpi0_name
)
66 PrintToConsole(L
"*%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 INT nPaddedLength
= 18;
89 NET_API_STATUS Status
;
91 Status
= NetLocalGroupGetInfo(NULL
,
94 (LPBYTE
*)&pGroupInfo
);
95 if (Status
!= NERR_Success
)
98 Status
= NetLocalGroupGetMembers(NULL
,
102 MAX_PREFERRED_LENGTH
,
106 if (Status
!= NERR_Success
)
109 Status
= NetServerGetInfo(NULL
,
112 if (Status
!= NERR_Success
)
115 pNames
= RtlAllocateHeap(RtlGetProcessHeap(),
117 dwRead
* sizeof(LPWSTR
));
120 Status
= ERROR_OUTOFMEMORY
;
124 len
= wcslen(pServer
->sv100_name
);
125 for (i
= 0; i
< dwRead
; i
++)
127 if (!wcsncmp(pMembers
[i
].lgrmi3_domainandname
, pServer
->sv100_name
, len
))
128 pNames
[i
] = &pMembers
[i
].lgrmi3_domainandname
[len
+ 1];
130 pNames
[i
] = pMembers
[i
].lgrmi3_domainandname
;
133 PrintPaddedResourceString(IDS_LOCALGROUP_ALIAS_NAME
, nPaddedLength
);
134 PrintToConsole(L
"%s\n", pGroupInfo
->lgrpi1_name
);
136 PrintPaddedResourceString(IDS_LOCALGROUP_COMMENT
, nPaddedLength
);
137 PrintToConsole(L
"%s\n", pGroupInfo
->lgrpi1_comment
);
139 PrintToConsole(L
"\n");
141 PrintResourceString(IDS_LOCALGROUP_MEMBERS
);
142 PrintToConsole(L
"\n\n");
144 PrintToConsole(L
"------------------------------------------\n");
146 for (i
= 0; i
< dwRead
; i
++)
149 PrintToConsole(L
"%s\n", pNames
[i
]);
154 RtlFreeHeap(RtlGetProcessHeap(), 0, pNames
);
157 NetApiBufferFree(pServer
);
159 if (pMembers
!= NULL
)
160 NetApiBufferFree(pMembers
);
162 if (pGroupInfo
!= NULL
)
163 NetApiBufferFree(pGroupInfo
);
176 ULONG dwMemberCount
= 0;
178 BOOL bDelete
= FALSE
;
180 BOOL bDomain
= FALSE
;
182 LPWSTR lpGroupName
= NULL
;
183 LPWSTR lpComment
= NULL
;
184 LPLOCALGROUP_MEMBERS_INFO_3 lpMembers
= NULL
;
185 LOCALGROUP_INFO_0 Info0
;
186 LOCALGROUP_INFO_1 Info1
;
187 LOCALGROUP_INFO_1002 Info1002
;
188 NET_API_STATUS Status
;
192 Status
= EnumerateLocalGroups();
193 printf("Status: %lu\n", Status
);
198 Status
= DisplayLocalGroup(argv
[2]);
199 printf("Status: %lu\n", Status
);
204 if (argv
[i
][0] != L
'/')
206 lpGroupName
= argv
[i
];
210 for (j
= i
; j
< argc
; j
++)
212 if (argv
[j
][0] == L
'/')
218 printf("Member count: %lu\n", dwMemberCount
);
220 if (dwMemberCount
> 0)
222 lpMembers
= RtlAllocateHeap(RtlGetProcessHeap(),
224 dwMemberCount
* sizeof(LPLOCALGROUP_MEMBERS_INFO_3
));
225 if (lpMembers
== NULL
)
230 for (; i
< argc
; i
++)
232 if (argv
[i
][0] == L
'/')
235 lpMembers
[j
].lgrmi3_domainandname
= argv
[i
];
239 for (; i
< argc
; i
++)
241 if (_wcsicmp(argv
[i
], L
"/help") == 0)
243 PrintResourceString(IDS_LOCALGROUP_HELP
);
246 else if (_wcsicmp(argv
[i
], L
"/add") == 0)
250 else if (_wcsicmp(argv
[i
], L
"/delete") == 0)
254 else if (_wcsnicmp(argv
[i
], L
"/comment:", 9) == 0)
256 lpComment
= &argv
[i
][9];
258 else if (_wcsicmp(argv
[i
], L
"/domain") == 0)
260 PrintResourceString(IDS_ERROR_OPTION_NOT_SUPPORTED
, L
"/DOMAIN");
272 if (lpGroupName
== NULL
)
285 printf("Group:\n %S\n", lpGroupName
);
287 if (lpMembers
!= NULL
)
289 printf("\nMembers:\n");
290 for (i
= 0; i
< dwMemberCount
; i
++)
291 printf(" %S\n", lpMembers
[i
].lgrmi3_domainandname
);
294 if (lpComment
!= NULL
)
296 printf("\nComment:\n %S\n", lpComment
);
300 if (lpMembers
== NULL
)
302 if (!bAdd
&& !bDelete
&& lpComment
!= NULL
)
304 /* Set group comment */
305 Info1002
.lgrpi1002_comment
= lpComment
;
306 Status
= NetLocalGroupSetInfo(NULL
,
311 printf("Status: %lu\n", Status
);
313 else if (bAdd
&& !bDelete
)
316 if (lpComment
== NULL
)
318 Info0
.lgrpi0_name
= lpGroupName
;
322 Info1
.lgrpi1_name
= lpGroupName
;
323 Info1
.lgrpi1_comment
= lpComment
;
326 Status
= NetLocalGroupAdd(NULL
,
327 (lpComment
== NULL
) ? 0 : 1,
328 (lpComment
== NULL
) ? (LPBYTE
)&Info0
: (LPBYTE
)&Info1
,
330 printf("Status: %lu\n", Status
);
332 else if (!bAdd
&& bDelete
&& lpComment
== NULL
)
334 /* Delete the group */
335 Status
= NetLocalGroupDel(NULL
,
337 printf("Status: %lu\n", Status
);
346 if (bAdd
&& !bDelete
&& lpComment
== NULL
)
348 /* Add group members */
349 Status
= NetLocalGroupAddMembers(NULL
,
354 printf("Status: %lu\n", Status
);
356 else if (!bAdd
&& bDelete
&& lpComment
== NULL
)
358 /* Delete group members */
359 Status
= NetLocalGroupDelMembers(NULL
,
364 printf("Status: %lu\n", Status
);
373 if (lpMembers
!= NULL
)
374 RtlFreeHeap(RtlGetProcessHeap(), 0, lpMembers
);
377 PrintResourceString(IDS_LOCALGROUP_SYNTAX
);