如何从本地网络中的远程计算机控制 Windows 服务?
Posted
技术标签:
【中文标题】如何从本地网络中的远程计算机控制 Windows 服务?【英文标题】:How to control windows services from remote computer in local network? 【发布时间】:2014-08-19 09:51:53 【问题描述】:我首先道歉,因为这似乎是重复的问题。 但是我做了很多谷歌,即使我找到了两个非常相似的,比如:
-
How to remotely control a Windows Service with ServiceController?
但不幸的是,它们都不适合我。
我开发了一个在 windows server 2008 R2 标准机器上运行的 windows 服务。
服务运行良好,运行良好。
我的问题是我想制作一个可以在我们的本地网络上运行的桌面应用程序。 在这个应用程序中,我想做一些基本的操作,比如获取服务状态、停止和重启。
这是我的工作。
private void WSControllerForm_Load(object sender, System.EventArgs e)
ConnectionOptions options = new ConnectionOptions();
options.Password = "password";
options.Username = "Administrator";
options.Impersonation =
System.Management.ImpersonationLevel.Impersonate;
options.EnablePrivileges = true;
options.Authority = "NTLMDOMAIN:IQ-HOME";
options.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope scope =
new ManagementScope(@"\\RTOKEN-SERVER\root\cimv2", options);
scope.Connect(); //checked its connected
// Make a connection to a remote computer.
// Replace the "FullComputerName" section of the
// string "\\\\FullComputerName\\root\\cimv2" with
// the full computer name or IP address of the
// remote computer.
ServiceController service = new ServiceController("Recharger Token", "RTOKEN-SERVER");
service.Refresh();
MessageBox.Show(service.Status.ToString()); //Error raised: "Cannot open Service Control Manager on computer 'rToken-server'. This operation might require other privileges."
请让我知道我做错了什么? 我应该如何实现我的目标?
注意:我的开发 PC 是 Windows 7 Ultimate,服务基于 Windows Server 2008 R2 Standard。 服务正在网络服务下运行。 (我也改成管理员登录,但没有运气)
谢谢
【问题讨论】:
您在域中吗?管理员是您服务器上的本地用户吗?防火墙会阻止吗? @ajg 不,它不是域。管理员是服务器上的管理员。我也打开了防火墙,但没有运气。是的,我确实注意到当防火墙关闭该命令service.Status.ToString()
运行非常快但结果相同。
什么是 IQ-HOME?您是否尝试过不使用 options.Authority 行?
@ajg IQ-HOME 是工作组。是的,我也尝试过不使用此选项。
使用您在上面构建的 ManagementScope 在***.com/questions/7117877/… 尝试答案。
【参考方案1】:
试试这个代码,它使用您的 ManagementScope,但使用 ManagementObjectSearcher 从我在 cmets 中提供的链接查询服务。
如果不是这样,我会调查您的用户是否有权做您需要的事情。
private void WSControllerForm_Load(object sender, System.EventArgs e)
ConnectionOptions options = new ConnectionOptions();
options.Password = "password";
options.Username = "Administrator";
//i'm not 100% sure these 4 lines are needed - try without if it still fails
options.Impersonation =
System.Management.ImpersonationLevel.Impersonate;
options.EnablePrivileges = true;
options.Authority = "NTLMDOMAIN:RTOKEN-SERVER";
options.Authentication = AuthenticationLevel.PacketPrivacy;
ManagementScope scope =
new ManagementScope(@"\\RTOKEN-SERVER\root\cimv2", options);
scope.Connect();
ManagementObjectSearcher moSearcher = new ManagementObjectSearcher();
moSearcher.Scope = scope;
moSearcher.Query = new ObjectQuery("SELECT * FROM win32_Service WHERE Name ='Recharger Token'");
ManagementObjectCollection mbCollection = moSearcher.Get();
foreach (ManagementObject oReturn in mbCollection)
//invoke start
//ManagementBaseObject outParams = oReturn.InvokeMethod("StartService", null, null);
//invoke stop
//ManagementBaseObject outParams = oReturn.InvokeMethod("StopService", null, null);
//get result
//string a = outParams["ReturnValue"].ToString();
//get service state
string state = oReturn.Properties["State"].Value.ToString().Trim();
MessageBox.Show(state);
【讨论】:
非常感谢@ajg 它有效。你能帮我如何重启服务吗? 太棒了!开始和停止的行已经存在 - 只是注释掉了。要重新启动,您先停止然后再启动 - 我认为这两种方法应该是同步的 对不起,我没有注意到注释代码。它工作正常。谢谢@ajg。以上是关于如何从本地网络中的远程计算机控制 Windows 服务?的主要内容,如果未能解决你的问题,请参考以下文章