我正在尝试使用以下代码控制远程计算机上的服务:
// 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);
当使用当前登录用户的凭据以及使用其他凭据时,从本地域中的计算机运行并定位同一域上的计算机时,此方法正常。
但是,当我尝试定位不在任何域上的计算机时,如果我将OpenSCManager
以外的任何内容指定为所需的访问权限,SC_MANAGER_CONNECT
调用将失败并拒绝访问。从域外的计算机中定位域计算机(对于作为目标计算机上的本地管理员的域用户,使用用户/域/密码组合)。从域外的计算机定位域外的计算机不起作用。
用户/密码是针对目标计算机上管理员组的成员,因此帐户权限应该没有问题。
我使用sc -sdshow scmanager
检查了scmanager安全描述符,它对于域计算机和非域计算机是相同的。两者都运行Windows 7 64位。
我还测试过使用psexec,它具有相同的症状,即在域计算机之间正常工作,但在目标非域计算机时则不行。
我还测试了在目标计算机上禁用RPC over TCP并重新启动它,因为这是described as a possible cause for access denied errors但这似乎没有帮助。我还测试了在targetmachine上禁用Windows防火墙,但没有改变。
是否需要启用某些设置才能使远程服务配置正常工作?
答案 0 :(得分:6)
这似乎是由Windows Vista及更高版本的新安全功能引起的。默认情况下,Windows不会授予远程连接用户完全管理员权限,除非在域中完成。因此,要使其正常工作,需要关闭User Account Control Remote Restrictions,但这当然也会降低计算机的安全性。
感谢Hans Passant建议检查similar issues posted on serverfault.com。