写入网络驱动器时,Windows服务获取访问权限被拒绝异常

时间:2017-02-01 12:53:07

标签: c# .net-4.5

我有一个在本地系统帐户上运行的交互式Windows服务,并且选中了Interact with desktop复选框(这对我的项目是必需的,因为我的服务需要使用UI调用.exe)。写入网络驱动器时,由于访问被拒绝,我收到异常。我从配置文件传递UNC路径。我试图给我想访问的文件夹上的匿名用户完全控制访问,但它仍然无法正常工作。我不能在网络服务帐户下或在其他一些帖子中的任何其他帐户下运行我的Windows服务,因为我希望它与桌面交互复选框已选中。有没有办法实现这个目标?

编辑:网络驱动器的UNC路径:// server / ABC / pqr

我的服务应该在pqr文件夹中创建.txt文件。应该也可以在之后删除它。

我尝试为pqr文件夹创建匿名用户并给予完全控制但仍然获得访问被拒绝的异常。正如我之前提到的,我无法在本地系统帐户以外的任何其他帐户下运行它,因为它将自动禁用与该服务的属性中的桌面选项交互。有没有办法让它在网络服务帐户下运行并仍然保持交互(与服务属性中选中的桌面选项交互)?

1 个答案:

答案 0 :(得分:0)

尝试使用名为SimpleImpersonation

的以下nugget包

通过这种方式,您可以包装用于访问远程文件位置的代码,如下所示:

    using (Impersonation.LogonUser(domain, username, password, logonType))
{
    // do whatever you want as this user.
}

它对我有用。我用它来远程打开和关闭Windows服务。像这样:

 await Task.Factory.StartNew(() =>
            {
                using (
                    Impersonation.LogonUser(serviceInfo.Domain, serviceInfo.User, serviceInfo.Pswd,
                        Environment.MachineName.Equals(serviceInfo.ComputerName,
                            StringComparison.InvariantCultureIgnoreCase)
                            ? LogonType.Network
                            : LogonType.Interactive))
                {
                    var service = new ServiceController(serviceInfo.ServiceName, serviceInfo.ComputerName);
                    if (service.Status == ServiceControllerStatus.Stopped)
                    {
                        service.Start();
                        service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(60));
                    }
                    else
                    {
                        service.Stop();
                        service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(60));
                    }
                }
            });

(摘录自项目网站)

相关问题