You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ma...@apache.org on 2019/05/23 20:56:02 UTC

[commons-daemon] 03/04: Add LocalService and NetworkService to procrun GUI for log on config

This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-daemon.git

commit 1ab887dc5eeb57c2c1f71453b9fac55d07486494
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu May 23 21:53:47 2019 +0100

    Add LocalService and NetworkService to procrun GUI for log on config
---
 src/changes/changes.xml                    |   4 +
 src/native/windows/apps/prunmgr/prunmgr.c  | 149 ++++++++++++++++++++---------
 src/native/windows/apps/prunmgr/prunmgr.h  |  20 ++--
 src/native/windows/apps/prunmgr/prunmgr.rc |  22 +++--
 src/site/xdoc/procrun.xml                  |   4 +
 5 files changed, 137 insertions(+), 62 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 456926a..1b6cd5a 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -96,6 +96,10 @@
         Procrun. Ensure that environment variables set via prunsrv are visible
         to native libraries that depend on the Universal CRT.
       </action> 
+      <action type="add" dev="markt">
+        Procrun. Add 'NT Authority\LocalService' and
+        'NT Authority\NetworkService' as options to the Log On user interface.
+      </action>
     </release>
     <release version="1.1.0" date="2017-11-15" description="Feature and bug fix release">
       <action issue="DAEMON-368" type="add" dev="ggregory">
diff --git a/src/native/windows/apps/prunmgr/prunmgr.c b/src/native/windows/apps/prunmgr/prunmgr.c
index 8f92f95..4f317bd 100644
--- a/src/native/windows/apps/prunmgr/prunmgr.c
+++ b/src/native/windows/apps/prunmgr/prunmgr.c
@@ -41,6 +41,9 @@ LPAPXGUISTORE _gui_store  = NULL;
 #define STAT_STOPPED        TEXT("Stopped")
 #define STAT_DISABLED       TEXT("Disabled")
 #define STAT_NONE           TEXT("")
+
+#define STAT_SERVICE        L"NT AUTHORITY\\LocalService"
+#define STAT_NET_SERVICE    L"NT AUTHORITY\\NetworkService"
 #define STAT_SYSTEM         L"LocalSystem"
 
 #define LOGL_ERROR          L"Error"
@@ -48,7 +51,6 @@ LPAPXGUISTORE _gui_store  = NULL;
 #define LOGL_INFO           L"Info"
 #define LOGL_WARN           L"Warn"
 
-
 #define START_AUTO           L"Automatic"
 #define START_MANUAL         L"Manual"
 #define START_DISABLED       L"Disabled"
@@ -340,7 +342,28 @@ BOOL __generalLogonSave(HWND hDlg)
     GetDlgItemTextW(hDlg, IDC_PPSLPASS,  szP, SIZ_RESMAX);
     GetDlgItemTextW(hDlg, IDC_PPSLCPASS, szC, SIZ_RESMAX);
 
-    if (lstrlenW(szU) && lstrcmpiW(szU, STAT_SYSTEM)) {
+    if (lstrlenW(szU) == 0 || lstrcmpiW(szU, STAT_SERVICE) == 0) {
+        apxServiceSetNames(hService, NULL, NULL, NULL, STAT_SERVICE, L"");
+        lstrlcpyW(_currentEntry->szObjectName, SIZ_RESLEN, STAT_SERVICE);
+    }
+    else if (lstrcmpiW(szU, STAT_NET_SERVICE) == 0) {
+        apxServiceSetNames(hService, NULL, NULL, NULL, STAT_NET_SERVICE, L"");
+        lstrlcpyW(_currentEntry->szObjectName, SIZ_RESLEN, STAT_NET_SERVICE);
+    }
+    else if (lstrcmpiW(szU, STAT_SYSTEM) == 0) {
+        apxServiceSetNames(hService, NULL, NULL, NULL, STAT_SYSTEM, L"");
+        lstrlcpyW(_currentEntry->szObjectName, SIZ_RESLEN, STAT_SYSTEM);
+        if (IsDlgButtonChecked(hDlg, IDC_PPSLID) == BST_CHECKED) {
+            apxServiceSetOptions(hService,
+                _currentEntry->stServiceStatus.dwServiceType | SERVICE_INTERACTIVE_PROCESS,
+                SERVICE_NO_CHANGE, SERVICE_NO_CHANGE);
+        }
+        else {
+            apxServiceSetOptions(hService,
+                _currentEntry->stServiceStatus.dwServiceType & ~SERVICE_INTERACTIVE_PROCESS,
+                SERVICE_NO_CHANGE, SERVICE_NO_CHANGE);
+        }
+    } else {
         if (szP[0] != L' ' &&  szC[0] != L' ' && !lstrcmpW(szP, szC)) {
             apxServiceSetNames(hService, NULL, NULL, NULL, szU, szP);
             lstrlcpyW(_currentEntry->szObjectName, SIZ_RESLEN, szU);
@@ -352,18 +375,7 @@ BOOL __generalLogonSave(HWND hDlg)
             return FALSE;
         }
     }
-    else {
-        apxServiceSetNames(hService, NULL, NULL, NULL, STAT_SYSTEM, L"");
-        lstrlcpyW(_currentEntry->szObjectName, SIZ_RESLEN, STAT_SYSTEM);
-        if (IsDlgButtonChecked(hDlg, IDC_PPSLID) == BST_CHECKED)
-            apxServiceSetOptions(hService,
-                _currentEntry->stServiceStatus.dwServiceType | SERVICE_INTERACTIVE_PROCESS,
-                SERVICE_NO_CHANGE, SERVICE_NO_CHANGE);
-        else
-            apxServiceSetOptions(hService,
-                _currentEntry->stServiceStatus.dwServiceType & ~SERVICE_INTERACTIVE_PROCESS,
-                SERVICE_NO_CHANGE, SERVICE_NO_CHANGE);
-    }
+
     if (!(TST_BIT_FLAG(_propertyChanged, 1)))
         PostMessage(_gui_store->hMainWnd, WM_COMMAND, MAKEWPARAM(IDMS_REFRESH, 0), 0);
     return TRUE;
@@ -709,7 +721,9 @@ LRESULT CALLBACK __logonProperty(HWND hDlg,
     switch (uMessage) {
         case WM_INITDIALOG:
             {
-                BOOL           bAccount = FALSE;
+                BOOL           bNamedAccount = FALSE;
+                BOOL           bLocalServiceAccount = FALSE;
+
                 startPage = 1;
                 if (!bpropCentered)
                     apxCenterWindow(GetParent(hDlg), NULL);
@@ -718,33 +732,86 @@ LRESULT CALLBACK __logonProperty(HWND hDlg,
                 SendMessage(GetDlgItem(hDlg, IDC_PPSLUSER), EM_LIMITTEXT, 63, 0);
                 SendMessage(GetDlgItem(hDlg, IDC_PPSLPASS), EM_LIMITTEXT, 63, 0);
                 SendMessage(GetDlgItem(hDlg, IDC_PPSLCPASS), EM_LIMITTEXT, 63, 0);
-                /* Check if we use LocalSystem or user defined account */
-                if (lstrcmpiW(_currentEntry->szObjectName, STAT_SYSTEM)) {
-                    bAccount = TRUE;
+
+                // LocalService
+                if (lstrcmpiW(_currentEntry->szObjectName, STAT_SERVICE) == 0) {
+                	CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, IDC_PPSLLSRV);
+                }
+                // NetworkService
+                else if (lstrcmpiW(_currentEntry->szObjectName, STAT_NET_SERVICE) == 0) {
+                	CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, IDC_PPSLNSRV);
+                }
+                // LocalSystem
+                else if (lstrcmpiW(_currentEntry->szObjectName, STAT_SYSTEM) == 0) {
+                	CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, IDC_PPSLLSYS);
+                	bLocalServiceAccount = TRUE;
+                    if (_currentEntry->lpConfig->dwServiceType & SERVICE_INTERACTIVE_PROCESS) {
+                        CheckDlgButton(hDlg, IDC_PPSLID, BST_CHECKED);
+                    }
+                }
+                else {
+                	bNamedAccount = TRUE;
                     CheckRadioButton(hDlg, IDC_PPSLLSYS, IDC_PPSLUA, IDC_PPSLUA);
                     SetDlgItemTextW(hDlg, IDC_PPSLUSER, _currentEntry->szObjectName);
                     SetDlgItemTextW(hDlg, IDC_PPSLPASS, EMPTY_PASSWORD);
                     SetDlgItemTextW(hDlg, IDC_PPSLCPASS, EMPTY_PASSWORD);
                 }
-                else {
-                    CheckRadioButton(hDlg, IDC_PPSLLSYS, IDC_PPSLUA, IDC_PPSLLSYS);
-                    if (_currentEntry->lpConfig->dwServiceType &
-                        SERVICE_INTERACTIVE_PROCESS)
-                        CheckDlgButton(hDlg, IDC_PPSLID, BST_CHECKED);
-                }
-                EnableWindow(GetDlgItem(hDlg, IDC_PPSLID), !bAccount);
-                EnableWindow(GetDlgItem(hDlg, IDC_PPSLUSER), bAccount);
-                EnableWindow(GetDlgItem(hDlg, IDC_PPSLBROWSE), bAccount);
-                EnableWindow(GetDlgItem(hDlg, IDL_PPSLPASS), bAccount);
-                EnableWindow(GetDlgItem(hDlg, IDC_PPSLPASS), bAccount);
-                EnableWindow(GetDlgItem(hDlg, IDL_PPSLCPASS), bAccount);
-                EnableWindow(GetDlgItem(hDlg, IDC_PPSLCPASS), bAccount);
+
+                EnableWindow(GetDlgItem(hDlg, IDC_PPSLID), !bLocalServiceAccount);
+                EnableWindow(GetDlgItem(hDlg, IDC_PPSLUSER), bNamedAccount);
+                EnableWindow(GetDlgItem(hDlg, IDC_PPSLBROWSE), bNamedAccount);
+                EnableWindow(GetDlgItem(hDlg, IDL_PPSLPASS), bNamedAccount);
+                EnableWindow(GetDlgItem(hDlg, IDC_PPSLPASS), bNamedAccount);
+                EnableWindow(GetDlgItem(hDlg, IDL_PPSLCPASS), bNamedAccount);
+                EnableWindow(GetDlgItem(hDlg, IDC_PPSLCPASS), bNamedAccount);
             }
         break;
         case WM_COMMAND:
             switch (LOWORD(wParam)) {
+                case IDC_PPSLLSRV:
+                    SetDlgItemTextW(hDlg, IDC_PPSLUSER, STAT_SERVICE);
+                    SetDlgItemTextW(hDlg, IDC_PPSLPASS, L"");
+                    SetDlgItemTextW(hDlg, IDC_PPSLCPASS, L"");
+                    EnableWindow(GetDlgItem(hDlg, IDC_PPSLID), TRUE);
+                    EnableWindow(GetDlgItem(hDlg, IDC_PPSLUSER), FALSE);
+                    EnableWindow(GetDlgItem(hDlg, IDC_PPSLBROWSE), FALSE);
+                    EnableWindow(GetDlgItem(hDlg, IDL_PPSLPASS), FALSE);
+                    EnableWindow(GetDlgItem(hDlg, IDC_PPSLPASS), FALSE);
+                    EnableWindow(GetDlgItem(hDlg, IDL_PPSLCPASS), FALSE);
+                    EnableWindow(GetDlgItem(hDlg, IDC_PPSLCPASS), FALSE);
+                    CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, (INT)wParam);
+                    if (lstrcmpiW(_currentEntry->szObjectName, STAT_SERVICE)) {
+                        PropSheet_Changed(GetParent(hDlg), hDlg);
+                        SET_BIT_FLAG(_propertyChanged, 2);
+                    }
+                    else {
+                        PropSheet_UnChanged(GetParent(hDlg), hDlg);
+                        CLR_BIT_FLAG(_propertyChanged, 2);
+                    }
+                break;
+                case IDC_PPSLNSRV:
+                    SetDlgItemTextW(hDlg, IDC_PPSLUSER, STAT_NET_SERVICE);
+                    SetDlgItemTextW(hDlg, IDC_PPSLPASS, L"");
+                    SetDlgItemTextW(hDlg, IDC_PPSLCPASS, L"");
+                    EnableWindow(GetDlgItem(hDlg, IDC_PPSLID), TRUE);
+                    EnableWindow(GetDlgItem(hDlg, IDC_PPSLUSER), FALSE);
+                    EnableWindow(GetDlgItem(hDlg, IDC_PPSLBROWSE), FALSE);
+                    EnableWindow(GetDlgItem(hDlg, IDL_PPSLPASS), FALSE);
+                    EnableWindow(GetDlgItem(hDlg, IDC_PPSLPASS), FALSE);
+                    EnableWindow(GetDlgItem(hDlg, IDL_PPSLCPASS), FALSE);
+                    EnableWindow(GetDlgItem(hDlg, IDC_PPSLCPASS), FALSE);
+                    CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, (INT)wParam);
+                    if (lstrcmpiW(_currentEntry->szObjectName, STAT_NET_SERVICE)) {
+                        PropSheet_Changed(GetParent(hDlg), hDlg);
+                        SET_BIT_FLAG(_propertyChanged, 2);
+                    }
+                    else {
+                        PropSheet_UnChanged(GetParent(hDlg), hDlg);
+                        CLR_BIT_FLAG(_propertyChanged, 2);
+                    }
+                break;
                 case IDC_PPSLLSYS:
-                    SetDlgItemTextW(hDlg, IDC_PPSLUSER, L"");
+                    SetDlgItemTextW(hDlg, IDC_PPSLUSER, STAT_SYSTEM);
                     SetDlgItemTextW(hDlg, IDC_PPSLPASS, L"");
                     SetDlgItemTextW(hDlg, IDC_PPSLCPASS, L"");
                     EnableWindow(GetDlgItem(hDlg, IDC_PPSLID), TRUE);
@@ -754,7 +821,7 @@ LRESULT CALLBACK __logonProperty(HWND hDlg,
                     EnableWindow(GetDlgItem(hDlg, IDC_PPSLPASS), FALSE);
                     EnableWindow(GetDlgItem(hDlg, IDL_PPSLCPASS), FALSE);
                     EnableWindow(GetDlgItem(hDlg, IDC_PPSLCPASS), FALSE);
-                    CheckRadioButton(hDlg, IDC_PPSLLSYS, IDC_PPSLUA, (INT)wParam);
+                    CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, (INT)wParam);
                     if (lstrcmpiW(_currentEntry->szObjectName, STAT_SYSTEM)) {
                         PropSheet_Changed(GetParent(hDlg), hDlg);
                         SET_BIT_FLAG(_propertyChanged, 2);
@@ -763,7 +830,7 @@ LRESULT CALLBACK __logonProperty(HWND hDlg,
                         PropSheet_UnChanged(GetParent(hDlg), hDlg);
                         CLR_BIT_FLAG(_propertyChanged, 2);
                     }
-                    break;
+                break;
                 case IDC_PPSLUA:
                     SetDlgItemTextW(hDlg, IDC_PPSLUSER, _currentEntry->szObjectName);
                     SetDlgItemTextW(hDlg, IDC_PPSLPASS, EMPTY_PASSWORD);
@@ -775,16 +842,10 @@ LRESULT CALLBACK __logonProperty(HWND hDlg,
                     EnableWindow(GetDlgItem(hDlg, IDC_PPSLPASS), TRUE);
                     EnableWindow(GetDlgItem(hDlg, IDL_PPSLCPASS), TRUE);
                     EnableWindow(GetDlgItem(hDlg, IDC_PPSLCPASS), TRUE);
-                    CheckRadioButton(hDlg, IDC_PPSLLSYS, IDC_PPSLUA, (INT)wParam);
-                    if (lstrcmpW(_currentEntry->szObjectName, STAT_SYSTEM)) {
-                        PropSheet_Changed(GetParent(hDlg), hDlg);
-                        SET_BIT_FLAG(_propertyChanged, 2);
-                    }
-                    else {
-                        PropSheet_UnChanged(GetParent(hDlg), hDlg);
-                        CLR_BIT_FLAG(_propertyChanged, 2);
-                    }
-                    break;
+                    CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA, (INT)wParam);
+					PropSheet_UnChanged(GetParent(hDlg), hDlg);
+					CLR_BIT_FLAG(_propertyChanged, 2);
+                break;
                 case IDC_PPSLID:
                     PropSheet_Changed(GetParent(hDlg), hDlg);
                     SET_BIT_FLAG(_propertyChanged, 2);
diff --git a/src/native/windows/apps/prunmgr/prunmgr.h b/src/native/windows/apps/prunmgr/prunmgr.h
index 206074c..6d9b273 100644
--- a/src/native/windows/apps/prunmgr/prunmgr.h
+++ b/src/native/windows/apps/prunmgr/prunmgr.h
@@ -58,15 +58,17 @@
 #define IDC_PPSGRESTART                 2610
 
 #define IDD_PROPPAGE_LOGON              2620
-#define IDC_PPSLLSYS                    2621
-#define IDC_PPSLID                      2622
-#define IDC_PPSLUA                      2623
-#define IDC_PPSLUSER                    2624
-#define IDC_PPSLBROWSE                  2625
-#define IDC_PPSLPASS                    2626
-#define IDC_PPSLCPASS                   2627
-#define IDL_PPSLPASS                    2628
-#define IDL_PPSLCPASS                   2629
+#define IDC_PPSLLSRV                    2621
+#define IDC_PPSLNSRV                    2622
+#define IDC_PPSLLSYS                    2623
+#define IDC_PPSLID                      2624
+#define IDC_PPSLUA                      2625
+#define IDC_PPSLUSER                    2626
+#define IDC_PPSLBROWSE                  2627
+#define IDC_PPSLPASS                    2628
+#define IDC_PPSLCPASS                   2629
+#define IDL_PPSLPASS                    2630
+#define IDL_PPSLCPASS                   2631
 
 #define IDD_PROPPAGE_LOGGING            2640
 #define IDC_PPLGLEVEL                   2641
diff --git a/src/native/windows/apps/prunmgr/prunmgr.rc b/src/native/windows/apps/prunmgr/prunmgr.rc
index 1b1e1e2..dcfeea0 100644
--- a/src/native/windows/apps/prunmgr/prunmgr.rc
+++ b/src/native/windows/apps/prunmgr/prunmgr.rc
@@ -108,18 +108,22 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
 FONT 8, "MS Shell Dlg", 0, 0, 0x0
 BEGIN
     LTEXT           "Log on as:",IDC_STATIC,10,8,51,8
-    CONTROL         "&Local System account",IDC_PPSLLSYS,"Button",
+    CONTROL         "&Local Service account",IDC_PPSLLSRV,"Button",
                     BS_AUTORADIOBUTTON,10,23,85,10
+    CONTROL         "&Network Service account",IDC_PPSLNSRV,"Button",
+                    BS_AUTORADIOBUTTON,10,45,95,10
+    CONTROL         "Local &System account",IDC_PPSLLSYS,"Button",
+                    BS_AUTORADIOBUTTON,10,67,85,10
     CONTROL         "Allo&w service to interact with desktop",IDC_PPSLID,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,21,37,135,10
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,21,81,135,10
     CONTROL         "&This account:",IDC_PPSLUA,"Button",BS_AUTORADIOBUTTON,
-                    10,59,61,10
-    EDITTEXT        IDC_PPSLUSER,86,58,114,12,ES_AUTOHSCROLL
-    PUSHBUTTON      "&Browse...",IDC_PPSLBROWSE,205,57,50,14
-    LTEXT           "&Password:",IDL_PPSLPASS,21,76,36,8
-    EDITTEXT        IDC_PPSLPASS,86,75,114,12,ES_PASSWORD | ES_AUTOHSCROLL
-    LTEXT           "&Confirm Password:",IDL_PPSLCPASS,20,93,63,8
-    EDITTEXT        IDC_PPSLCPASS,86,92,114,12,ES_PASSWORD | ES_AUTOHSCROLL
+                    10,103,61,10
+    EDITTEXT        IDC_PPSLUSER,86,102,114,12,ES_AUTOHSCROLL
+    PUSHBUTTON      "&Browse...",IDC_PPSLBROWSE,205,101,50,14
+    LTEXT           "&Password:",IDL_PPSLPASS,21,120,36,8
+    EDITTEXT        IDC_PPSLPASS,86,119,114,12,ES_PASSWORD | ES_AUTOHSCROLL
+    LTEXT           "&Confirm Password:",IDL_PPSLCPASS,20,137,63,8
+    EDITTEXT        IDC_PPSLCPASS,86,136,114,12,ES_PASSWORD | ES_AUTOHSCROLL
 END
 
 IDD_PROPPAGE_LOGGING DIALOGEX 0, 0, 260, 243
diff --git a/src/site/xdoc/procrun.xml b/src/site/xdoc/procrun.xml
index 715965e..5838b24 100644
--- a/src/site/xdoc/procrun.xml
+++ b/src/site/xdoc/procrun.xml
@@ -354,6 +354,10 @@ will add the new value(s) to any existing value(s).
         Use an account name in the form <i>DomainName\UserName</i>.
         The service process will be logged on as this user.
         if the account belongs to the built-in domain, you can specify <i>.\UserName</i>
+        Note that the Service Control Manager does not accept localised forms of
+        the standard names so to use them you need to specify
+        <i>NT Authority\LocalService</i>, <i>NT Authority\NetworkService</i> or
+        <i>LocalSystem</i> as appropriate.
     </td>
     </tr>
     <tr>