我有一个应用程序,它包括服务和一个可执行的。基本上这是一个形式的应用程序,负责开始,并停止服务在特定情况。

在Windows XP的应用程序管理的这个好用下列代码:

ServiceController controller = new ServiceController();
controller.MachineName = ".";
controller.ServiceName = "XXXXXXXXXX";
controller.Stop();
controller.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 10));
controller.Start();

但是,在Windows7,即使我已经开始应用程序管理员,我得到以下例外:

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凭据提示(或实际运行为管理员帐户,而不是管理员组中的帐户),则您的应用程序没有修改服务的许可,因此您看到的例外是正确的。

此示例代码可以检查您的应用程序是否作为管理员运行,如果没有,请启动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方法不能显示同意对话框框。代码返回,假如果你是在标准的用户作用,甚至如果你是在建立管理员小组。你可以提升自己的特权,在你执行代码右击的应用程序标和指示要运行一个管理员。

我记得我很惊讶在第1时使用7(我从来没有使用Vista)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top