关于Windows:远程OpenSCManager失败,访问被拒绝

Remote OpenSCManager fails with access denied

我试图使用以下代码控制远程计算机上的服务:

1
2
3
4
5
6
7
8
9
10
11
// Error checking omitted for brevity
HANDLE hToken = NULL;
// user = username with no domain specification
// domain = targetmachine when targetting computer outside of domain
LogonUser(user, domain, password,
    LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &hToken);

ImpersonateLoggedOnUser(hToken);

SC_HANDLE hSc = OpenSCManager(targetmachine,
                    SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS);

从本地域中的计算机运行并在同一域中将计算机定位到目标计算机时,无论使用当前登录用户的凭据还是使用其他凭据,此方法都可以正常工作。

但是,当我尝试定位不在任何域上的计算机时,如果我将SC_MANAGER_CONNECT以外的其他内容指定为所需访问权限,则OpenSCManager调用将失败,访问被拒绝。从域外的计算机定位域计算机是可行的(使用目标计算机上本地管理员的域用户的用户/域/密码组合)。从域外的计算机定向到域外的计算机无效。

用户/密码用于目标计算机上的管理员组的成员,因此帐户权限应该没有问题。

我已经使用sc -sdshow scmanager检查了scmanager安全描述符,它对于域计算机和非域计算机是相同的。两者都运行Windows 7 64位。

我还测试了使用具有相同症状的psexec,即在域计算机之间可以正常工作,但在定位非域计算机时却不能。

我还测试了在目标计算机上禁用RPC over TCP并重新启动它,因为这被描述为访问被拒绝错误的可能原因,但这似乎无济于事。我还测试了禁用目标计算机上的Windows防火墙,但没有任何更改。

为了使服务的远程配置生效,是否需要启用某些设置?


看来这是由Windows Vista及更高版本的新安全功能引起的。 默认情况下,Windows不会授予远程连接用户完整的管理员权限,除非在域中进行。 因此,为使此功能正常运行,需要关闭"用户帐户控制远程限制",但这当然也会降低计算机的安全性。

感谢Hans Passant建议检查在serverfault.com上发布的类似问题。