我正在尝试使用以下代码来控制远程计算机上的服务:
// 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上发布的类似问题 。