在远程Windows系统上重新启动服务的最简单的编程方法是什么?语言或方法无关紧要,只要它不需要人为干预即可.
我试图使用以下代码控制远程计算机上的服务:
// 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);
Run Code Online (Sandbox Code Playgroud)
从使用当前登录用户的凭据以及使用其他凭据时,从本地域中的计算机运行并在同一域上定位计算机时,此方法可以正常工作.
但是,当我尝试定位不在任何域上的计算机时,OpenSCManager如果我指定除了SC_MANAGER_CONNECT所需访问之外的任何内容,则调用将失败并拒绝访问.从域外的计算机中定位域计算机(对于作为目标计算机上的本地管理员的域用户,使用用户/域/密码组合).从域外的计算机定位域外的计算机不起作用.
用户/密码是针对目标计算机上管理员组的成员,因此帐户权限不应存在问题.
我已经检查了scmanager安全描述符sc -sdshow scmanager,它对于域计算机和非域计算机是相同的.两者都运行Windows 7 64位.
我也测试过使用psexec,它有相同的症状,即在域计算机之间工作正常但在目标非域计算机时不能.
我还测试了在目标计算机上禁用RPC over TCP并重新启动它,因为这被描述为访问被拒绝错误的可能原因,但这似乎没有帮助.我还测试了在targetmachine上禁用Windows防火墙,但没有变化.
是否需要启用某些设置才能使远程服务配置正常工作?