Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS net command * FILE: base/applications/network/net/cmdLocalGroup.c * PURPOSE: * * PROGRAMMERS: Eric Kohl */
#include "net.h"
staticintCompareInfo(const void *a, const void *b){ return _wcsicmp(((PLOCALGROUP_INFO_0)a)->lgrpi0_name, ((PLOCALGROUP_INFO_0)b)->lgrpi0_name);}
staticNET_API_STATUSEnumerateLocalGroups(VOID){ PLOCALGROUP_INFO_0 pBuffer = NULL; PSERVER_INFO_100 pServer = NULL; DWORD dwRead = 0, dwTotal = 0; DWORD i; DWORD_PTR ResumeHandle = 0; NET_API_STATUS Status;
Status = NetServerGetInfo(NULL, 100, (LPBYTE*)&pServer); if (Status != NERR_Success) return Status;
ConPuts(StdOut, L"\n"); PrintMessageStringV(4405, pServer->sv100_name); ConPuts(StdOut, L"\n"); PrintPadding(L'-', 79); ConPuts(StdOut, L"\n");
NetApiBufferFree(pServer);
Status = NetLocalGroupEnum(NULL, 0, (LPBYTE*)&pBuffer, MAX_PREFERRED_LENGTH, &dwRead, &dwTotal, &ResumeHandle); if (Status != NERR_Success) return Status;
qsort(pBuffer, dwRead, sizeof(PLOCALGROUP_INFO_0), CompareInfo);
for (i = 0; i < dwRead; i++) { if (pBuffer[i].lgrpi0_name) ConPrintf(StdOut, L"*%s\n", pBuffer[i].lgrpi0_name); }
NetApiBufferFree(pBuffer);
return NERR_Success;}
staticNET_API_STATUSDisplayLocalGroup(LPWSTR lpGroupName){ PLOCALGROUP_INFO_1 pGroupInfo = NULL; PLOCALGROUP_MEMBERS_INFO_3 pMembers = NULL; PSERVER_INFO_100 pServer = NULL; LPWSTR *pNames = NULL; DWORD dwRead = 0; DWORD dwTotal = 0; DWORD_PTR ResumeHandle = 0; DWORD i; DWORD len; INT nPaddedLength = 18; NET_API_STATUS Status;
Status = NetLocalGroupGetInfo(NULL, lpGroupName, 1, (LPBYTE*)&pGroupInfo); if (Status != NERR_Success) return Status;
Status = NetLocalGroupGetMembers(NULL, lpGroupName, 3, (LPBYTE*)&pMembers, MAX_PREFERRED_LENGTH, &dwRead, &dwTotal, &ResumeHandle); if (Status != NERR_Success) goto done;
Status = NetServerGetInfo(NULL, 100, (LPBYTE*)&pServer); if (Status != NERR_Success) goto done;
pNames = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, dwRead * sizeof(LPWSTR)); if (pNames == NULL) { Status = ERROR_OUTOFMEMORY; goto done; }
len = wcslen(pServer->sv100_name); for (i = 0; i < dwRead; i++) { if (!wcsncmp(pMembers[i].lgrmi3_domainandname, pServer->sv100_name, len)) pNames[i] = &pMembers[i].lgrmi3_domainandname[len + 1]; else pNames[i] = pMembers[i].lgrmi3_domainandname; }
PrintPaddedMessageString(4406, nPaddedLength); ConPrintf(StdOut, L"%s\n", pGroupInfo->lgrpi1_name);
PrintPaddedMessageString(4407, nPaddedLength); ConPrintf(StdOut, L"%s\n", pGroupInfo->lgrpi1_comment);
ConPuts(StdOut, L"\n");
PrintMessageString(4408); ConPuts(StdOut, L"\n");
PrintPadding(L'-', 79); ConPuts(StdOut, L"\n");
for (i = 0; i < dwRead; i++) { if (pNames[i]) ConPrintf(StdOut, L"%s\n", pNames[i]); }
done: if (pNames != NULL) RtlFreeHeap(RtlGetProcessHeap(), 0, pNames);
if (pServer != NULL) NetApiBufferFree(pServer);
if (pMembers != NULL) NetApiBufferFree(pMembers);
if (pGroupInfo != NULL) NetApiBufferFree(pGroupInfo);
return Status;}
INTcmdLocalGroup( INT argc, WCHAR **argv){ INT i, j; INT result = 0; ULONG dwMemberCount = 0; BOOL bAdd = FALSE; BOOL bDelete = FALSE;#if 0 BOOL bDomain = FALSE;#endif LPWSTR lpGroupName = NULL; LPWSTR lpComment = NULL; LPLOCALGROUP_MEMBERS_INFO_3 lpMembers = NULL; LOCALGROUP_INFO_0 Info0; LOCALGROUP_INFO_1 Info1; LOCALGROUP_INFO_1002 Info1002; NET_API_STATUS Status;
if (argc == 2) { Status = EnumerateLocalGroups(); ConPrintf(StdOut, L"Status: %lu\n", Status); return 0; } else if (argc == 3) { Status = DisplayLocalGroup(argv[2]); ConPrintf(StdOut, L"Status: %lu\n", Status); return 0; }
i = 2; if (argv[i][0] != L'/') { lpGroupName = argv[i]; i++; }
for (j = i; j < argc; j++) { if (argv[j][0] == L'/') break;
dwMemberCount++; }
ConPrintf(StdOut, L"Member count: %lu\n", dwMemberCount);
if (dwMemberCount > 0) { lpMembers = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, dwMemberCount * sizeof(LPLOCALGROUP_MEMBERS_INFO_3)); if (lpMembers == NULL) return 0; }
j = 0; for (; i < argc; i++) { if (argv[i][0] == L'/') break;
lpMembers[j].lgrmi3_domainandname = argv[i]; j++; }
for (; i < argc; i++) { if (_wcsicmp(argv[i], L"/help") == 0) { PrintMessageString(4381); ConPuts(StdOut, L"\n"); PrintNetMessage(MSG_LOCALGROUP_SYNTAX); PrintNetMessage(MSG_LOCALGROUP_HELP); return 0; } else if (_wcsicmp(argv[i], L"/add") == 0) { bAdd = TRUE; } else if (_wcsicmp(argv[i], L"/delete") == 0) { bDelete = TRUE; } else if (_wcsnicmp(argv[i], L"/comment:", 9) == 0) { lpComment = &argv[i][9]; } else if (_wcsicmp(argv[i], L"/domain") == 0) { ConPuts(StdErr, L"The /DOMAIN option is not supported yet.\n");#if 0 bDomain = TRUE;#endif } else { PrintErrorMessage(3506/*, argv[i]*/); result = 1; goto done; } }
if (lpGroupName == NULL) { result = 1; goto done; }
if (bAdd && bDelete) { result = 1; goto done; }
#if 0 ConPrintf(StdOut, L"Group:\n %s\n", lpGroupName);
if (lpMembers != NULL) { ConPuts(StdOut, L"\nMembers:\n"); for (i = 0; i < dwMemberCount; i++) ConPrintf(StdOut, L" %s\n", lpMembers[i].lgrmi3_domainandname); }
if (lpComment != NULL) { ConPrintf(StdOut, L"\nComment:\n %s\n", lpComment); }#endif
if (lpMembers == NULL) { if (!bAdd && !bDelete && lpComment != NULL) { /* Set group comment */ Info1002.lgrpi1002_comment = lpComment; Status = NetLocalGroupSetInfo(NULL, lpGroupName, 1002, (LPBYTE)&Info1002, NULL); ConPrintf(StdOut, L"Status: %lu\n", Status); } else if (bAdd && !bDelete) { /* Add the group */ if (lpComment == NULL) { Info0.lgrpi0_name = lpGroupName; } else { Info1.lgrpi1_name = lpGroupName; Info1.lgrpi1_comment = lpComment; }
Status = NetLocalGroupAdd(NULL, (lpComment == NULL) ? 0 : 1, (lpComment == NULL) ? (LPBYTE)&Info0 : (LPBYTE)&Info1, NULL); ConPrintf(StdOut, L"Status: %lu\n", Status); } else if (!bAdd && bDelete && lpComment == NULL) { /* Delete the group */ Status = NetLocalGroupDel(NULL, lpGroupName); ConPrintf(StdOut, L"Status: %lu\n", Status); } else { result = 1; } } else { if (bAdd && !bDelete && lpComment == NULL) { /* Add group members */ Status = NetLocalGroupAddMembers(NULL, lpGroupName, 3, (LPBYTE)lpMembers, dwMemberCount); ConPrintf(StdOut, L"Status: %lu\n", Status); } else if (!bAdd && bDelete && lpComment == NULL) { /* Delete group members */ Status = NetLocalGroupDelMembers(NULL, lpGroupName, 3, (LPBYTE)lpMembers, dwMemberCount); ConPrintf(StdOut, L"Status: %lu\n", Status); } else { result = 1; } }
done: if (lpMembers != NULL) RtlFreeHeap(RtlGetProcessHeap(), 0, lpMembers);
if (result != 0) { PrintMessageString(4381); ConPuts(StdOut, L"\n"); PrintNetMessage(MSG_LOCALGROUP_SYNTAX); }
return result;}
/* EOF */