通过 PsExec 执行时,.NET 应用程序无法连接到 ServiceController

通过 PsExec 执行时,.NET 应用程序无法连接到 ServiceController

我正在尝试使用 Packer 和 Ansible 自动安装应用程序。

在某些时候,我们使用 Selenium 自动执行的软件安装程序会检查某些 Windows 服务是否正在运行。我们用一个简单的控制台应用程序重现了这个特定的部分:

// Connect with ServiceController
ServiceController sc = new ServiceController("WAS");
if (sc != null && sc.Status == ServiceControllerStatus.Running)
{
    Console.WriteLine("Service is running");
    return 0;
}
else
{
    Console.WriteLine("Service is not running");
    return 1;
}

手动运行时(右键单击,以管理员身份运行),此方法有效。通过 Ansible 运行时,我们收到一个异常:

Cannot open Service Control Manager on computer '.'. This operation might require other privileges. InnerException: Access is denied.

为了执行此过程,我们使用这个 Ansible 任务:

    - name: Test Service access
      community.windows.win_psexec:
        command: "{{ installation_directory.path }}/servicecontroller-test.exe"
        chdir: "{{ installation_directory.path }}"
        interactive: true
        session: 1
        username: nxservice
        password: ********
        elevated: true

用户的创建和操作如下:

    - name: Create service administrator user
      ansible.windows.win_user:
        name: nxservice
        password: ********
        description: "xxxx Application Service User"
        state: present
        groups:
          - Administrators
          - IIS_IUSRS
          - Performance Monitor Users
      register: nxservice_user

    - name: Add account to Log on as a service
      ansible.windows.win_user_right:
        name: SeServiceLogonRight
        users:
          - .\nxservice
        action: add

    - name: Get the existing security descriptor for scmanager
      ansible.windows.win_command: sc sdshow scmanager
      register: scmanager_acl

    - name: Set new security descriptor for scmanager
      ansible.windows.win_command: sc sdset scmanager "D:(A;;CCLCRPWPRC;;;{{ nxservice_user.sid }}){{ scmanager_acl.stdout_lines[1][2:] }}"

    - name: Grant account to control Process Activation Service
      ansible.windows.win_shell: Grant-CServicePermission -Name WAS -Identity nxservice -FullControl

    - name: Grant account to control World Wide Web Publishing Service
      ansible.windows.win_shell: Grant-CServicePermission -Name W3SVC -Identity nxservice -FullControl

但即使完成所有这些操作后,代码似乎仍然无法连接到 ServiceController。

答案1

请在运行代码的工作站上检查以下 GPO 设置的有效值(gpedit.msc 或 gpresult 将显示)

用户帐户控制:在管理员批准模式下运行所有​​管理员用户帐户控制:在管理员批准模式下管理员的提升提示行为

这两个设置影响本地管理员组成员(而不是内置管理员用户),例如 Nxservice 用户。

如果第一个设置已启用,请将第二个设置设为“提升而不提示”并进行测试。

请注意,此设置可能会削弱安全性。如果您的代码使用此 GPO 设置运行,您可以选择在代码中批准同意。

相关内容