Mat*_*ows 12 .net c# servicecontroller
我有一个由服务和可执行文件组成的应用程序.本质上,它是一个表单应用程序,负责在特定情况下启动和停止服务.
在Windows XP上,应用程序使用以下代码管理此项:
ServiceController controller = new ServiceController();
controller.MachineName = ".";
controller.ServiceName = "XXXXXXXXXX";
controller.Stop();
controller.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 10));
controller.Start();
Run Code Online (Sandbox Code Playgroud)
但是在Windows 7上,即使我以管理员身份启动了应用程序,我也会遇到以下异常:
System.InvalidOperationException: Cannot open XXXXXXXXXXXXX service on computer '.'. ---> System.ComponentModel.Win32Exception: Access is denied
--- End of inner exception stack trace ---
at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
at System.ServiceProcess.ServiceController.Start(String[] args)
at System.ServiceProcess.ServiceController.Start()
Run Code Online (Sandbox Code Playgroud)
有什么我可以通过编程方式解决这个问题吗?
Mat*_*ira 13
当您说您以管理员身份启动应用程序时,您是指管理员组中的帐户,还是通过请求管理员凭据的UAC提示?如果没有UAC凭据提示(或实际作为管理员帐户运行,而不是Administrators组中的帐户),则您的应用程序无权修改服务,因此您看到的异常是正确的.
这段示例代码可以检查您的应用程序是否以管理员身份运行,如果没有,则启动UAC提示.
public static class VistaSecurity
{
public static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
if (null != identity)
{
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
return false;
}
public static Process RunProcess(string name, string arguments)
{
string path = Path.GetDirectoryName(name);
if (String.IsNullOrEmpty(path))
{
path = Environment.CurrentDirectory;
}
ProcessStartInfo info = new ProcessStartInfo
{
UseShellExecute = true,
WorkingDirectory = path,
FileName = name,
Arguments = arguments
};
if (!IsAdministrator())
{
info.Verb = "runas";
}
try
{
return Process.Start(info);
}
catch (Win32Exception ex)
{
Trace.WriteLine(ex);
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)