我编写了一个安装程序,该安装程序安装了Windows服务(A),该服务需要启动/停止另一个服务(B)。但是,当A尝试开始/停止B时,我会得到此例外:

System.InvalidoperationException:无法在计算机上打开MyService服务'。 ---> system.com.ponentmodel.win32 exception:拒绝访问

安装程序将服务作为本地服务安装,并通过我授予的UAC弹出窗口请求管理权。我还向服务中添加了一个app.manifest文件,该文件设置为询问管理权:

但是我仍然遇到这个错误。

这就是我启动服务的方式(停止是相同的,当然要调用停止):

using (Mutex mutex = new Mutex(false, "MyServiceLock"))
{
    mutex.WaitOne();

    if (ServiceExists(serviceName) == true)
    {
        using (ServiceController serviceController = new ServiceController(serviceName, "."))
        {
            serviceController.Start(); // this line throws the exception
        }
    }

    mutex.ReleaseMutex();
}

为什么会拒绝访问此服务?

有帮助吗?

解决方案

服务不能要求UAC高程。在我看来,您描述的UAC提示实际上是由安装程序而不是服务要求的。服务通常已经使用非常特权的帐户运行,默认情况下是本地系统。请确保您配置服务以使用此类特权帐户,而不是受限制的用户帐户。

其他提示

作为快速测试,如果您打开 services.msc 并检查您的服务器以“运行为”并输入您的凭据,错误会消失吗?当地服务可能无法访问其他服务。提供UAC提示权限可能只允许您首先安装服务,而不是告诉它作为管理员运行。

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