Author: ekohl
Date: Sun Oct 19 20:12:19 2014
New Revision: 64834
URL: 
http://svn.reactos.org/svn/reactos?rev=64834&view=rev
Log:
[NET]
- 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.
Added:
    trunk/reactos/base/applications/network/net/cmdLocalGroup.c   (with props)
Modified:
    trunk/reactos/base/applications/network/net/CMakeLists.txt
    trunk/reactos/base/applications/network/net/cmdAccounts.c
    trunk/reactos/base/applications/network/net/lang/en-US.rc
    trunk/reactos/base/applications/network/net/lang/ro-RO.rc
    trunk/reactos/base/applications/network/net/lang/ru-RU.rc
    trunk/reactos/base/applications/network/net/main.c
    trunk/reactos/base/applications/network/net/net.h
Modified: trunk/reactos/base/applications/network/net/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/network/…
==============================================================================
--- trunk/reactos/base/applications/network/net/CMakeLists.txt  [iso-8859-1] (original)
+++ trunk/reactos/base/applications/network/net/CMakeLists.txt  [iso-8859-1] Sun Oct 19
20:12:19 2014
@@ -4,11 +4,12 @@
 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)
Modified: trunk/reactos/base/applications/network/net/cmdAccounts.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/network/…
==============================================================================
--- trunk/reactos/base/applications/network/net/cmdAccounts.c   [iso-8859-1] (original)
+++ trunk/reactos/base/applications/network/net/cmdAccounts.c   [iso-8859-1] Sun Oct 19
20:12:19 2014
@@ -24,7 +24,9 @@
     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 @@
             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);
Added: trunk/reactos/base/applications/network/net/cmdLocalGroup.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/network/…
==============================================================================
--- trunk/reactos/base/applications/network/net/cmdLocalGroup.c (added)
+++ trunk/reactos/base/applications/network/net/cmdLocalGroup.c [iso-8859-1] Sun Oct 19
20:12:19 2014
@@ -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 */
Propchange: trunk/reactos/base/applications/network/net/cmdLocalGroup.c
------------------------------------------------------------------------------
    svn:eol-style = native
Modified: trunk/reactos/base/applications/network/net/lang/en-US.rc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/network/…
==============================================================================
--- trunk/reactos/base/applications/network/net/lang/en-US.rc   [iso-8859-1] (original)
+++ trunk/reactos/base/applications/network/net/lang/en-US.rc   [iso-8859-1] Sun Oct 19
20:12:19 2014
@@ -18,7 +18,9 @@
     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..."
Modified: trunk/reactos/base/applications/network/net/lang/ro-RO.rc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/network/…
==============================================================================
--- trunk/reactos/base/applications/network/net/lang/ro-RO.rc   [iso-8859-1] (original)
+++ trunk/reactos/base/applications/network/net/lang/ro-RO.rc   [iso-8859-1] Sun Oct 19
20:12:19 2014
@@ -24,7 +24,9 @@
     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..."
Modified: trunk/reactos/base/applications/network/net/lang/ru-RU.rc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/network/…
==============================================================================
--- trunk/reactos/base/applications/network/net/lang/ru-RU.rc   [iso-8859-1] (original)
+++ trunk/reactos/base/applications/network/net/lang/ru-RU.rc   [iso-8859-1] Sun Oct 19
20:12:19 2014
@@ -19,7 +19,9 @@
     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..."
Modified: trunk/reactos/base/applications/network/net/main.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/network/…
==============================================================================
--- trunk/reactos/base/applications/network/net/main.c  [iso-8859-1] (original)
+++ trunk/reactos/base/applications/network/net/main.c  [iso-8859-1] Sun Oct 19 20:12:19
2014
@@ -28,7 +28,7 @@
     {L"group",      unimplemented},
     {L"help",       cmdHelp},
     {L"helpmsg",    cmdHelpMsg},
-    {L"localgroup", unimplemented},
+    {L"localgroup", cmdLocalGroup},
     {L"name",       unimplemented},
     {L"pause",      cmdPause},
     {L"print",      unimplemented},
Modified: trunk/reactos/base/applications/network/net/net.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/network/…
==============================================================================
--- trunk/reactos/base/applications/network/net/net.h   [iso-8859-1] (original)
+++ trunk/reactos/base/applications/network/net/net.h   [iso-8859-1] Sun Oct 19 20:12:19
2014
@@ -35,6 +35,7 @@
 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);