Windows 7中的ServiceController权限

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)