Windows 7中的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(); 

但是在Windows 7上,即使我以管理员身份启动了应用程序,我也会遇到以下exception:

 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() 

有什么我可以通过编程方式解决这个问题吗?

当您说您以管理员身份启动应用程序时,您是指管理员组中的帐户,还是通过请求管理员凭据的UAC提示? 如果没有UAC凭据提示(或实际以管理员帐户身份运行,而不是Administrators组中的帐户),则您的应用程序无权修改服务,因此您看到的exception是正确的。

这段示例代码可以检查您的应用程序是否以管理员身份运行,如果没有,则启动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; } } 

您还可以尝试将应用程序的UAC设置为代码中的“以管理员身份运行” 。

仅供参考,如果您不理解为什么它不能在Vista或7中工作,即使当前用户在管理员组中,这也是MSDN所说的

在Windows Vista中,用户帐户控制(UAC)确定用户的权限。 如果您是内置管理员组的成员,则会为您分配两个运行时访问令牌:标准用户访问令牌和管理员访问令牌。 默认情况下,您处于标准用户角色。 当您尝试执行需要管理权限的任务时,可以使用“同意”对话框动态提升角色。 执行IsInRole方法的代码不显示“同意​​”对话框。 如果您处于标准用户角色,则代码将返回false,即使您位于内置管理员组中也是如此。 通过右键单击应用程序图标并指示要以管理员身份运行,可以在执行代码之前提升权限。

我记得第一次使用7时我很惊讶(我从未使用Vista)。