gpt4 book ai didi

c# - 无法在计算机上打开服务控制管理器

转载 作者:可可西里 更新时间:2023-11-01 11:52:52 24 4
gpt4 key购买 nike

我正在尝试编写一个程序来连接到远程服务器并显示服务的某些状态。服务也是我们(我公司)写的。

为此,我编写了一个控制台应用程序,代码是

static void Main(string[] args)
{
ConnectionOptions options = new ConnectionOptions();
options.Password = "mypassword";
options.Username = "Administrator";
options.Impersonation =
System.Management.ImpersonationLevel.Impersonate;

ManagementScope scope =
new ManagementScope(
"\\\\ip_of_the_server\\root\\cimv2", options);
scope.Connect();

ServiceController svc = new ServiceController("My_Service_Name", "ip_of_the_server");

var status = svc.Status.ToString();
Console.WriteLine(svc.DisplayName + " : " status);

}

但我无法让它工作。我得到的错误是:

Cannot open Service Control Manager on computer 'ip_of_the_server'. This operation might require other privileges.

内部异常:“拒绝访问”。

堆栈跟踪:

   at System.ServiceProcess.ServiceController.GetDataBaseHandleWithAccess(String     machineName, Int32 serviceControlManaqerAccess)
at System.ServiceProcess.ServiceController.GetDataBaseHandleWithConnectAccess()
at System.ServiceProcess.ServiceController.GenerateNames()
at System.ServiceProcess.ServiceController.get_ServiceName()
at System.ServiceProcess.ServiceController.GenerateStatus()
at System.ServiceProcess.ServiceController.get_Status()
at ServiceConsole.Program.Main(String[] args) in c:\Users\Kandroid\Documents\Visual Studio 2013\Projects\ServiceConsole\ServiceConsole\Program.cs:line 33
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

知道怎么解决吗?

最佳答案

因为您已经设置了管理范围,只需使用 WQL 查询 WMI 提供程序以获得正确的 WMI 对象,在本例中为 WIN32_Service ,像这样:

var svc = new ManagementObjectSearcher(
scope,
new ObjectQuery("Select Status,State from Win32_Service where Name='My_Service_Name'"))
.Get()
.GetEnumerator();

if (svc.MoveNext())
{
var status = svc.Current["Status"].ToString();
var state = svc.Current["State"].ToString();
Console.WriteLine("service status {0}", status);
// if not running, StartService
if (!String.Equals(state, "running",StringComparison.InvariantCultureIgnoreCase) {
( (ManagementObject) svc.Current ).InvokeMethod("StartService", new object[] {});
}
}
else
{
Console.WriteLine("service not found");
}

ManagementObjectSearcher负责检索 WMI 托管对象的集合。一个ObjectQuery将从范围返回类的实例。我们可以执行基本的 sql select 语句来选择和投影结果集。

迭代器返回 ManagementObjectBase具有 Item 访问器以从返回的实例中检索属性。

关于c# - 无法在计算机上打开服务控制管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25525962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com