我正在尝试使用 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 设置运行,您可以选择在代码中批准同意。