- Add the localgroup command. It does not work properly on ReactOS yet.
- Print a warning when the domain option of the accounts command is used. 

svn path=/trunk/; revision=64834
This commit is contained in:
Eric Kohl 2014-10-19 20:12:19 +00:00
parent a0149739ce
commit 7cd22fe762
8 changed files with 303 additions and 10 deletions

View file

@ -4,11 +4,12 @@ add_definitions(-D__USE_W32_SOCKETS)
list(APPEND SOURCE
main.c
cmdAccounts.c
cmdContinue.c
cmdHelpMsg.c
cmdLocalGroup.c
cmdPause.c
cmdStart.c
cmdStop.c
cmdHelpMsg.c
cmdPause.c
cmdContinue.c
help.c
net.h)

View file

@ -24,7 +24,9 @@ cmdAccounts(
ULONG value;
INT i;
BOOL Modified = FALSE;
// BOOL Domain = FALSE;
#if 0
BOOL Domain = FALSE;
#endif
NET_API_STATUS Status;
INT result = 0;
@ -44,12 +46,13 @@ cmdAccounts(
return 0;
}
/*
if (_wcsicmp(argv[i], L"/domain") == 0)
{
printf("The /DOMAIN option is not supported yet!\n");
#if 0
Domain = TRUE;
#endif
}
*/
}
Status = NetUserModalsGet(NULL, 0, (LPBYTE*)&Info0);

View file

@ -0,0 +1,282 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS net command
* FILE:
* PURPOSE:
*
* PROGRAMMERS: Eric Kohl
*/
#include "net.h"
static
int
CompareInfo(const void *a,
const void *b)
{
return _wcsicmp(((PLOCALGROUP_INFO_0)a)->lgrpi0_name,
((PLOCALGROUP_INFO_0)b)->lgrpi0_name);
}
static
NET_API_STATUS
EnumerateLocalGroups(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;
printf("\nAliases for \\\\%S\n\n", pServer->sv100_name);
printf("------------------------------------------\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);
// printf("dwRead: %lu dwTotal: %lu\n", dwRead, dwTotal);
for (i = 0; i < dwRead; i++)
{
// printf("%p\n", pBuffer[i].lgrpi0_name);
if (pBuffer[i].lgrpi0_name)
printf("*%S\n", pBuffer[i].lgrpi0_name);
}
NetApiBufferFree(pBuffer);
return NERR_Success;
}
INT
cmdLocalGroup(
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();
printf("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++;
}
printf("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)
{
PrintResourceString(IDS_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)
{
printf("The /DOMAIN option is not supported yet!\n");
#if 0
bDomain = TRUE;
#endif
}
else
{
result = 1;
goto done;
}
}
if (lpGroupName == NULL)
{
result = 1;
goto done;
}
if (bAdd && bDelete)
{
result = 1;
goto done;
}
#if 0
printf("Group:\n %S\n", lpGroupName);
if (lpMembers != NULL)
{
printf("\nMembers:\n");
for (i = 0; i < dwMemberCount; i++)
printf(" %S\n", lpMembers[i].lgrmi3_domainandname);
}
if (lpComment != NULL)
{
printf("\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);
printf("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);
printf("Status: %lu\n", Status);
}
else if (!bAdd && bDelete && lpComment == NULL)
{
/* Delete the group */
Status = NetLocalGroupDel(NULL,
lpGroupName);
printf("Status: %lu\n", Status);
}
else
{
result = 1;
}
}
else
{
if (bAdd && !bDelete && lpComment == NULL)
{
/* Add group members */
Status = NetLocalGroupAddMembers(NULL,
lpGroupName,
3,
(LPBYTE)lpMembers,
dwMemberCount);
printf("Status: %lu\n", Status);
}
else if (!bAdd && bDelete && lpComment == NULL)
{
/* Delete group members */
Status = NetLocalGroupDelMembers(NULL,
lpGroupName,
3,
(LPBYTE)lpMembers,
dwMemberCount);
printf("Status: %lu\n", Status);
}
else
{
result = 1;
}
}
done:
if (lpMembers != NULL)
RtlFreeHeap(RtlGetProcessHeap(), 0, lpMembers);
if (result != 0)
PrintResourceString(IDS_LOCALGROUP_SYNTAX);
return result;
}
/* EOF */

View file

@ -18,7 +18,9 @@ BEGIN
IDS_GROUP_HELP "GROUP\n..."
IDS_HELPMSG_SYNTAX "Usage:\nNET HELPMSG <Error Code>"
IDS_HELPMSG_HELP "HELPMSG\n..."
IDS_LOCALGROUP_SYNTAX "Usage:\nNET LOCALGROUP ..."
IDS_LOCALGROUP_SYNTAX "Usage:\nNET LOCALGROUP [groupname [/COMMENT:""text""]] [/DOMAIN]\n\
groupname {/ADD [/COMMENT:""text""] | /DELETE} [/DOMAIN]\n\
groupname name [...] {/ADD | /DELETE} [/DOMAIN]"
IDS_LOCALGROUP_HELP "LOCALGROUP\n..."
IDS_NAME_SYNTAX "Usage:\nNET NAME ..."
IDS_NAME_HELP "NAME\n..."

View file

@ -24,7 +24,9 @@ BEGIN
IDS_GROUP_HELP "GROUP\n..."
IDS_HELPMSG_SYNTAX "Utilizare:\nNET HELPMSG <Error Code>"
IDS_HELPMSG_HELP "HELPMSG\n..."
IDS_LOCALGROUP_SYNTAX "Utilizare:\nNET LOCALGROUP ..."
IDS_LOCALGROUP_SYNTAX "Utilizare:\nNET LOCALGROUP [groupname [/COMMENT:""text""]] [/DOMAIN]\n\
groupname {/ADD [/COMMENT:""text""] | /DELETE} [/DOMAIN]\n\
groupname name [...] {/ADD | /DELETE} [/DOMAIN]"
IDS_LOCALGROUP_HELP "LOCALGROUP\n..."
IDS_NAME_SYNTAX "Utilizare:\nNET NAME ..."
IDS_NAME_HELP "NAME\n..."

View file

@ -19,7 +19,9 @@ BEGIN
IDS_GROUP_HELP "GROUP\n..."
IDS_HELPMSG_SYNTAX "Использование:\nNET HELPMSG <Код ошибки>"
IDS_HELPMSG_HELP "HELPMSG\n..."
IDS_LOCALGROUP_SYNTAX "Использование:\nNET LOCALGROUP ..."
IDS_LOCALGROUP_SYNTAX "Использование:\nNET LOCALGROUP [groupname [/COMMENT:""text""]] [/DOMAIN]\n\
groupname {/ADD [/COMMENT:""text""] | /DELETE} [/DOMAIN]\n\
groupname name [...] {/ADD | /DELETE} [/DOMAIN]"
IDS_LOCALGROUP_HELP "LOCALGROUP\n..."
IDS_NAME_SYNTAX "Использование:\nNET NAME ..."
IDS_NAME_HELP "NAME\n..."

View file

@ -28,7 +28,7 @@ COMMAND cmds[] =
{L"group", unimplemented},
{L"help", cmdHelp},
{L"helpmsg", cmdHelpMsg},
{L"localgroup", unimplemented},
{L"localgroup", cmdLocalGroup},
{L"name", unimplemented},
{L"pause", cmdPause},
{L"print", unimplemented},

View file

@ -35,6 +35,7 @@ INT cmdAccounts(INT argc, WCHAR **argv);
INT cmdContinue(INT argc, WCHAR **argv);
INT cmdHelp(INT argc, WCHAR **argv);
INT cmdHelpMsg(INT argc, WCHAR **argv);
INT cmdLocalGroup(INT argc, WCHAR **argv);
INT cmdPause(INT argc, WCHAR **argv);
INT cmdStart(INT argc, WCHAR **argv);
INT cmdStop(INT argc, WCHAR **argv);