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
The following commit(s) were added to refs/heads/master by this push:
new 602ca54 Fix DAEMON-411 Correct ' interact with desktop' configuration
602ca54 is described below
commit 602ca54360f2bcc7bd0993c754101dfac6f09697
Author: Mark Thomas <[email protected]>
AuthorDate: Thu Nov 21 21:49:39 2019 +0000
Fix DAEMON-411 Correct ' interact with desktop' configuration
Multiple issues:
- No error message if specified with wrong user (has to be LocalSystem)
- Didn't configure option when set when installing new service
- Made option available with wrong users in GUI
- Failed to save option correctly when setting option was only change
made in GUI
Signed-off-by: Mark Thomas <[email protected]>
---
src/changes/changes.xml | 7 +++++++
src/native/windows/apps/prunmgr/prunmgr.c | 21 ++++++++++++---------
src/native/windows/apps/prunsrv/prunsrv.c | 17 +++++++++++++++--
src/native/windows/src/service.c | 14 ++++++++++----
src/site/xdoc/procrun.xml | 2 +-
5 files changed, 45 insertions(+), 16 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 03bb314..c0d2c53 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -42,6 +42,13 @@
<action issue="DAEMON-414" type="fix" dev="ggregory" due-to="Gary
Gregory">
prunsrv uses its log is before it is initialized.
</action>
+ <action issue="DAEMON-411" type="fix" dev="markt">
+ Procrun. Correct multiple issues related to enabling a service to
+ interact with the desktop. Provide a better error message if this
option
+ is used with an invalid user, install the service with the option
+ enabled if requested and correctly save the setting if it is enabled in
+ the GUI.
+ </action>
</release>
<release version="1.2.2" date="2019-10-04" description="Bug fix release">
<action issue="DAEMON-408" type="fix" dev="markt">
diff --git a/src/native/windows/apps/prunmgr/prunmgr.c
b/src/native/windows/apps/prunmgr/prunmgr.c
index 14d6e99..b8b7ba1 100644
--- a/src/native/windows/apps/prunmgr/prunmgr.c
+++ b/src/native/windows/apps/prunmgr/prunmgr.c
@@ -735,7 +735,7 @@ INT_PTR CALLBACK __logonProperty(HWND hDlg,
case WM_INITDIALOG:
{
BOOL bNamedAccount = FALSE;
- BOOL bLocalServiceAccount = FALSE;
+ BOOL bLocalSystemAccount = FALSE;
startPage = 1;
if (!bpropCentered)
@@ -748,29 +748,32 @@ INT_PTR CALLBACK __logonProperty(HWND hDlg,
// LocalService
if (lstrcmpiW(_currentEntry->szObjectName, STAT_SERVICE) == 0)
{
- CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA,
IDC_PPSLLSRV);
+ CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA,
IDC_PPSLLSRV);
+ SetDlgItemTextW(hDlg, IDC_PPSLUSER, STAT_SERVICE);
}
// NetworkService
else if (lstrcmpiW(_currentEntry->szObjectName,
STAT_NET_SERVICE) == 0) {
- CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA,
IDC_PPSLNSRV);
+ CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA,
IDC_PPSLNSRV);
+ SetDlgItemTextW(hDlg, IDC_PPSLUSER, STAT_NET_SERVICE);
}
// LocalSystem
else if (lstrcmpiW(_currentEntry->szObjectName, STAT_SYSTEM)
== 0) {
- CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA,
IDC_PPSLLSYS);
- bLocalServiceAccount = TRUE;
+ CheckRadioButton(hDlg, IDC_PPSLLSRV, IDC_PPSLUA,
IDC_PPSLLSYS);
+ SetDlgItemTextW(hDlg, IDC_PPSLUSER, STAT_SYSTEM);
+ bLocalSystemAccount = TRUE;
if (_currentEntry->lpConfig->dwServiceType &
SERVICE_INTERACTIVE_PROCESS) {
CheckDlgButton(hDlg, IDC_PPSLID, BST_CHECKED);
}
}
else {
- bNamedAccount = TRUE;
+ 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);
}
- EnableWindow(GetDlgItem(hDlg, IDC_PPSLID),
!bLocalServiceAccount);
+ EnableWindow(GetDlgItem(hDlg, IDC_PPSLID),
bLocalSystemAccount);
EnableWindow(GetDlgItem(hDlg, IDC_PPSLUSER), bNamedAccount);
EnableWindow(GetDlgItem(hDlg, IDC_PPSLBROWSE), bNamedAccount);
EnableWindow(GetDlgItem(hDlg, IDL_PPSLPASS), bNamedAccount);
@@ -785,7 +788,7 @@ INT_PTR CALLBACK __logonProperty(HWND hDlg,
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_PPSLID), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_PPSLUSER), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_PPSLBROWSE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDL_PPSLPASS), FALSE);
@@ -806,7 +809,7 @@ INT_PTR CALLBACK __logonProperty(HWND hDlg,
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_PPSLID), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_PPSLUSER), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_PPSLBROWSE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDL_PPSLPASS), FALSE);
diff --git a/src/native/windows/apps/prunsrv/prunsrv.c
b/src/native/windows/apps/prunsrv/prunsrv.c
index bf2d12c..d854664 100644
--- a/src/native/windows/apps/prunsrv/prunsrv.c
+++ b/src/native/windows/apps/prunsrv/prunsrv.c
@@ -630,8 +630,21 @@ static BOOL docmdInstallService(LPAPXCMDLINE lpCmdline)
dwStart = SERVICE_AUTO_START;
/* Check the service type */
if ((ST_TYPE & APXCMDOPT_FOUND) &&
- lstrcmpiW(SO_TYPE, STYPE_INTERACTIVE) == 0)
- dwType |= SERVICE_INTERACTIVE_PROCESS;
+ lstrcmpiW(SO_TYPE, STYPE_INTERACTIVE) == 0) {
+
+ // Need to run as LocalSystem to set the interactive flag
+ LPCWSTR su = NULL;
+ if (ST_SUSER & APXCMDOPT_FOUND) {
+ su = SO_SUSER;
+ }
+ if (su && lstrcmpiW(su, L"LocalSystem") == 0) {
+ dwType |= SERVICE_INTERACTIVE_PROCESS;
+ } else {
+ apxLogWrite(APXLOG_MARK_ERROR
+ "The parameter '--Type interactive' is only valid with
'--ServiceUser LocalSystem'");
+ return FALSE;
+ }
+ }
/* Check if --Install is provided */
if (!IS_VALID_STRING(SO_INSTALL)) {
diff --git a/src/native/windows/src/service.c b/src/native/windows/src/service.c
index 7d1925e..78d9a38 100644
--- a/src/native/windows/src/service.c
+++ b/src/native/windows/src/service.c
@@ -238,10 +238,8 @@ apxServiceSetNames(APXHANDLE hService,
/* Check if the ServiceOpen has been called */
if (IS_INVALID_HANDLE(lpService->hService))
return FALSE;
- if (szUsername || szPassword)
- dwServiceType = SERVICE_WIN32_OWN_PROCESS;
if (!ChangeServiceConfigW(lpService->hService,
- dwServiceType,
+ SERVICE_NO_CHANGE,
SERVICE_NO_CHANGE,
SERVICE_NO_CHANGE,
szImagePath,
@@ -584,6 +582,7 @@ apxServiceInstall(APXHANDLE hService, LPCWSTR szServiceName,
DWORD dwStartType)
{
LPAPXSERVICE lpService;
+ LPCWSTR szServiceUser = L"NT Authority\\LocalService";
if (hService->dwType != APXHANDLE_TYPE_SERVICE)
return FALSE;
@@ -610,6 +609,13 @@ apxServiceInstall(APXHANDLE hService, LPCWSTR
szServiceName,
L"Tcpip\0Afd\0", NULL);
else
lpDependencies = L"Tcpip\0Afd\0";
+
+ if ((dwServiceType & SERVICE_INTERACTIVE_PROCESS) ==
SERVICE_INTERACTIVE_PROCESS) {
+ // Caller is responsible for checking the user is set appropriately
+ // for an interactive service (will use LocalSystem)
+ szServiceUser = NULL;
+ }
+
lpService->hService = CreateServiceW(lpService->hManager,
szServiceName,
szDisplayName,
@@ -621,7 +627,7 @@ apxServiceInstall(APXHANDLE hService, LPCWSTR szServiceName,
NULL,
NULL,
lpDependencies,
- L"NT Authority\\LocalService",
+ szServiceUser,
NULL);
if (IS_INVALID_HANDLE(lpService->hService)) {
diff --git a/src/site/xdoc/procrun.xml b/src/site/xdoc/procrun.xml
index 70217b1..c6d039e 100644
--- a/src/site/xdoc/procrun.xml
+++ b/src/site/xdoc/procrun.xml
@@ -318,7 +318,7 @@ will add the new value(s) to any existing value(s).
<td>--Type</td>
<td></td>
<td>Service type can be <b>interactive</b> to allow the service to
interact with the desktop.
- Use this option only with Local system accounts.</td>
+ This option can only be used with the <i>LocalSystem</i> account.</td>
</tr>
<tr>
<td>++DependsOn</td>