远程OpenSCManager失败,访问被拒绝

我正在尝试使用以下代码来控制远程计算机上的服务

// 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); 

当从本地域中的计算机运行并在同一个域中定位一台计算机时,这两种方式都可以正常工作,无论是使用当前login用户的凭据还是使用其他凭据。

但是,当我尝试locking不在任何域的计算机时,如果我指定SC_MANAGER_CONNECT以外的任何内容作为所需的访问权限,则OpenSCManager调用将失败,并且访问被拒绝。 从位于域外的计算机运行域计算机(对于作为目标计算机上本地pipe理员的域用户使用用户/域/密码组合)。 从域外的计算机将目标计算机置于域外不起作用。

用户/密码是针对目标计算机上pipe理员组的成员,因此不应该存在帐户权限问题。

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

我也testing过使用psexec ,它具有相同的症状,即在域计算机之间正常工作,但在定位非域计算机时不起作用。

我也testing过在目标机器上禁用RPC over TCP并重新启动它,因为这被描述为拒绝访问错误的一个可能的原因,但是这似乎没有帮助。 我也testing过在目标机器上禁用Windows防火墙,但是没有改变。

是否需要启用某些设置才能使服务的远程configuration正常工作?

看来,这是由Windows Vista及更高版本中的新安全功能引起的。 默认情况下,Windows不会授予远程连接用户完全管理员权限,除非在域内完成。 所以为了这个工作, 用户帐户控制远程限制需要关闭,但当然这也会降低您的计算机的安全性。

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