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
);
82 ULONG dwMemberCount
= 0;
88 LPWSTR lpGroupName
= NULL
;
89 LPWSTR lpComment
= NULL
;
90 LPLOCALGROUP_MEMBERS_INFO_3 lpMembers
= NULL
;
91 LOCALGROUP_INFO_0 Info0
;
92 LOCALGROUP_INFO_1 Info1
;
93 LOCALGROUP_INFO_1002 Info1002
;
94 NET_API_STATUS Status
;
98 Status
= EnumerateLocalGroups();
99 printf("Status: %lu\n", Status
);
104 if (argv
[i
][0] != L
'/')
106 lpGroupName
= argv
[i
];
110 for (j
= i
; j
< argc
; j
++)
112 if (argv
[j
][0] == L
'/')
118 printf("Member count: %lu\n", dwMemberCount
);
120 if (dwMemberCount
> 0)
122 lpMembers
= RtlAllocateHeap(RtlGetProcessHeap(),
124 dwMemberCount
* sizeof(LPLOCALGROUP_MEMBERS_INFO_3
));
125 if (lpMembers
== NULL
)
130 for (; i
< argc
; i
++)
132 if (argv
[i
][0] == L
'/')
135 lpMembers
[j
].lgrmi3_domainandname
= argv
[i
];
139 for (; i
< argc
; i
++)
141 if (_wcsicmp(argv
[i
], L
"/help") == 0)
143 PrintResourceString(IDS_LOCALGROUP_HELP
);
146 else if (_wcsicmp(argv
[i
], L
"/add") == 0)
150 else if (_wcsicmp(argv
[i
], L
"/delete") == 0)
154 else if (_wcsnicmp(argv
[i
], L
"/comment:", 9) == 0)
156 lpComment
= &argv
[i
][9];
158 else if (_wcsicmp(argv
[i
], L
"/domain") == 0)
160 printf("The /DOMAIN option is not supported yet!\n");
172 if (lpGroupName
== NULL
)
185 printf("Group:\n %S\n", lpGroupName
);
187 if (lpMembers
!= NULL
)
189 printf("\nMembers:\n");
190 for (i
= 0; i
< dwMemberCount
; i
++)
191 printf(" %S\n", lpMembers
[i
].lgrmi3_domainandname
);
194 if (lpComment
!= NULL
)
196 printf("\nComment:\n %S\n", lpComment
);
200 if (lpMembers
== NULL
)
202 if (!bAdd
&& !bDelete
&& lpComment
!= NULL
)
204 /* Set group comment */
205 Info1002
.lgrpi1002_comment
= lpComment
;
206 Status
= NetLocalGroupSetInfo(NULL
,
211 printf("Status: %lu\n", Status
);
213 else if (bAdd
&& !bDelete
)
216 if (lpComment
== NULL
)
218 Info0
.lgrpi0_name
= lpGroupName
;
222 Info1
.lgrpi1_name
= lpGroupName
;
223 Info1
.lgrpi1_comment
= lpComment
;
226 Status
= NetLocalGroupAdd(NULL
,
227 (lpComment
== NULL
) ? 0 : 1,
228 (lpComment
== NULL
) ? (LPBYTE
)&Info0
: (LPBYTE
)&Info1
,
230 printf("Status: %lu\n", Status
);
232 else if (!bAdd
&& bDelete
&& lpComment
== NULL
)
234 /* Delete the group */
235 Status
= NetLocalGroupDel(NULL
,
237 printf("Status: %lu\n", Status
);
246 if (bAdd
&& !bDelete
&& lpComment
== NULL
)
248 /* Add group members */
249 Status
= NetLocalGroupAddMembers(NULL
,
254 printf("Status: %lu\n", Status
);
256 else if (!bAdd
&& bDelete
&& lpComment
== NULL
)
258 /* Delete group members */
259 Status
= NetLocalGroupDelMembers(NULL
,
264 printf("Status: %lu\n", Status
);
273 if (lpMembers
!= NULL
)
274 RtlFreeHeap(RtlGetProcessHeap(), 0, lpMembers
);
277 PrintResourceString(IDS_LOCALGROUP_SYNTAX
);