Я пытаюсь написать программу, которая будет подключаться к удаленному серверу и отображать некоторый статус службы. Услуга также написана нами (моей компанией).
Для этого я написал консольное приложение, и код
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 для выбора и вывода результатов.
Итератор возвращает ManagementObjectBase, который имеет Item
доступа Access, чтобы извлекать свойства из возвращаемого экземпляра.