Author: ekohl
Date: Sat Jun 11 15:01:01 2016
New Revision: 71612

URL: http://svn.reactos.org/svn/reactos?rev=71612&view=rev
Log:
[SC]
Implement the sdset command.

Added:
    trunk/reactos/base/applications/sc/sdset.c   (with props)
Modified:
    trunk/reactos/base/applications/sc/CMakeLists.txt
    trunk/reactos/base/applications/sc/sc.c
    trunk/reactos/base/applications/sc/sc.h
    trunk/reactos/base/applications/sc/usage.c

Modified: trunk/reactos/base/applications/sc/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/CMakeLists.txt?rev=71612&r1=71611&r2=71612&view=diff
==============================================================================
--- trunk/reactos/base/applications/sc/CMakeLists.txt   [iso-8859-1] (original)
+++ trunk/reactos/base/applications/sc/CMakeLists.txt   [iso-8859-1] Sat Jun 11 
15:01:01 2016
@@ -8,6 +8,7 @@
     print.c
     query.c
     sc.c
+    sdset.c
     sdshow.c
     start.c
     usage.c

Modified: trunk/reactos/base/applications/sc/sc.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/sc.c?rev=71612&r1=71611&r2=71612&view=diff
==============================================================================
--- trunk/reactos/base/applications/sc/sc.c     [iso-8859-1] (original)
+++ trunk/reactos/base/applications/sc/sc.c     [iso-8859-1] Sat Jun 11 
15:01:01 2016
@@ -191,6 +191,23 @@
         else
             SdShowUsage();
     }
+    else if (!lstrcmpi(Command, _T("sdset")))
+    {
+        LPCTSTR SecurityDescriptor;
+
+        if (ArgCount > 1)
+        {
+            ServiceName = *ServiceArgs++;
+            ArgCount--;
+
+            SecurityDescriptor = *ServiceArgs++;
+            ArgCount--;
+
+            SdSet(ServiceName, SecurityDescriptor);
+        }
+        else
+            SdSetUsage();
+    }
     else
     {
         MainUsage();

Modified: trunk/reactos/base/applications/sc/sc.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/sc.h?rev=71612&r1=71611&r2=71612&view=diff
==============================================================================
--- trunk/reactos/base/applications/sc/sc.h     [iso-8859-1] (original)
+++ trunk/reactos/base/applications/sc/sc.h     [iso-8859-1] Sat Jun 11 
15:01:01 2016
@@ -20,6 +20,7 @@
 
 LPSERVICE_STATUS_PROCESS QueryService(LPCTSTR ServiceName);
 BOOL SdShow(LPCTSTR ServiceName);
+BOOL SdSet(LPCTSTR ServiceName, LPCTSTR SecurityDescriptor);
 
 /* print and error functions */
 VOID PrintService(LPCTSTR ServiceName, LPSERVICE_STATUS_PROCESS pStatus, BOOL 
bExtended);
@@ -38,5 +39,6 @@
 VOID CreateUsage(VOID);
 VOID ControlUsage(VOID);
 VOID SdShowUsage(VOID);
+VOID SdSetUsage(VOID);
 
 #endif /* _SC_PCH_ */

Added: trunk/reactos/base/applications/sc/sdset.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/sdset.c?rev=71612
==============================================================================
--- trunk/reactos/base/applications/sc/sdset.c  (added)
+++ trunk/reactos/base/applications/sc/sdset.c  [iso-8859-1] Sat Jun 11 
15:01:01 2016
@@ -0,0 +1,71 @@
+/*
+ * PROJECT:     ReactOS Services
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        base/applications/sc/sdset.c
+ * PURPOSE:     Set a service security descriptor
+ * COPYRIGHT:   Copyright 2016 Eric Kohl
+ *
+ */
+
+#include "sc.h"
+
+BOOL SdSet(LPCTSTR ServiceName, LPCTSTR StringSecurityDescriptor)
+{
+    SC_HANDLE hManager = NULL;
+    SC_HANDLE hService = NULL;
+    BOOL bResult = TRUE;
+    ULONG ulSecurityDescriptorSize = 0;
+    PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL;
+
+#ifdef SCDBG
+    _tprintf(_T("service to set sd - %s\n\n"), ServiceName);
+#endif
+
+    hManager = OpenSCManager(NULL,
+                             NULL,
+                             SC_MANAGER_CONNECT);
+    if (hManager == NULL)
+    {
+        bResult = FALSE;
+        goto done;
+    }
+
+    hService = OpenService(hManager, ServiceName, WRITE_DAC);
+    if (hService == NULL)
+    {
+        bResult = FALSE;
+        goto done;
+    }
+
+    if 
(!ConvertStringSecurityDescriptorToSecurityDescriptor(StringSecurityDescriptor,
+                                                             SDDL_REVISION_1,
+                                                             
&pSecurityDescriptor,
+                                                             
&ulSecurityDescriptorSize))
+    {
+        bResult = FALSE;
+        goto done;
+    }
+
+    if (!SetServiceObjectSecurity(hService,
+                                  DACL_SECURITY_INFORMATION,
+                                  pSecurityDescriptor))
+    {
+        bResult = FALSE;
+        goto done;
+    }
+
+done:
+    if (bResult == FALSE)
+        ReportLastError();
+
+    if (pSecurityDescriptor != NULL)
+        LocalFree(pSecurityDescriptor);
+
+    if (hService)
+        CloseServiceHandle(hService);
+
+    if (hManager)
+        CloseServiceHandle(hManager);
+
+    return bResult;
+}

Propchange: trunk/reactos/base/applications/sc/sdset.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/base/applications/sc/usage.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/sc/usage.c?rev=71612&r1=71611&r2=71612&view=diff
==============================================================================
--- trunk/reactos/base/applications/sc/usage.c  [iso-8859-1] (original)
+++ trunk/reactos/base/applications/sc/usage.c  [iso-8859-1] Sat Jun 11 
15:01:01 2016
@@ -42,8 +42,8 @@
     _T("\t  delete         : Deletes a service (from the registry).\n")
     _T("\t  create         : Creates a service. (adds it to the registry).\n")
     _T("\t  control        : Sends a control to a service.\n")
-    _T("\t  sdshow         : Displays a service's security descriptor.\n"));
-//    "\t  sdset          : Sets a service's security descriptor.\n")
+    _T("\t  sdshow         : Displays a service's security descriptor.\n")
+    _T("\t  sdset          : Sets a service's security descriptor.\n"));
 //    "\t  GetDisplayName : Gets the DisplayName for a service.\n")
 //    "\t  GetKeyName     : Gets the ServiceKeyName for a service.\n")
 //    "\t  EnumDepend     : Enumerates Service Dependencies.\n")
@@ -198,3 +198,11 @@
                 _T("USAGE:\n")
                 _T("        sc <server> sdshow <service name>\n"));
 }
+
+VOID SdSetUsage(VOID)
+{
+    _tprintf(_T("DESCRIPTION:\n")
+                _T("        Sets a service's security descriptor.\n")
+                _T("USAGE:\n")
+                _T("        sc <server> sdset <service name> <SD in SDDL 
format>\n"));
+}


Reply via email to