【问题标题】:Error 5 : Access Denied when starting windows service错误 5:启动 windows 服务时拒绝访问
【发布时间】:2011-05-15 02:26:08
【问题描述】:

当我尝试启动我在 C# 中创建的 Windows 服务时遇到此错误:

到目前为止我的代码:

private ServiceHost host = null;

public RightAccessHost()
{
    InitializeComponent();
}

protected override void OnStart(string[] args)
{
    host = new ServiceHost(typeof(RightAccessWcf));
    host.Open();
}

protected override void OnStop()
{
    if (host != null)
        host.Close();
    host = null;
}

更新 #1

我通过授予帐户 NETWORK SERVICE 权限解决了上述问题,但现在我遇到了另一个问题:

更新 #2

服务无法启动。 System.InvalidOperationException:服务“RightAccessManagementWcf.RightAccessWcf”的应用程序(非基础设施)端点为零。这可能是因为没有为您的应用程序找到配置文件,或者因为在配置文件中找不到与服务名称匹配的服务元素,或者因为在服务元素中没有定义端点。 在 System.ServiceModel.Description.DispatcherBuilder.EnsureThereAreNonMexEndpoints(ServiceDescription 描述) 在 System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription 描述,ServiceHostBase 服务主机) 在 System.ServiceModel.ServiceHostBase.InitializeRuntime() 在 System.ServiceModel.ServiceHostBase.OnOpen(时间跨度超时) 在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度超时) 在 C:\Users 中的 RightAccessHosting.RightAccessHost.OnStart(String[] args)....

【问题讨论】:

  • 您的第二个问题并不容易仅从该消息中解决。您需要查看事件日志,看看真正的错误是什么。
  • 检查系统帐户是否可以访问该文件夹。

标签: c# .net wcf windows-services


【解决方案1】:

我知道这篇文章已经过时了,但没有明确的解决方案,我只是想说明一下我是如何解决这个问题的。

第一个Error 5: Access Denied 错误已通过将输出目录的权限授予NETWORK SERVICE 帐户来解决。

第二个Started and then stopped 错误似乎是服务出现故障时的一般消息。检查事件查看器(特别是“Windows 日志 > 应用程序”)以获取真正的错误消息。

就我而言,这是 app.config 中的错误服务配置设置。

【讨论】:

  • 我修改了权限,使用资源管理器导航到文件夹,右键单击,属性,安全,然后为用户名列表中的 NETWORK SERVICE 帐户分配正确的权限。
  • 在关于“错误 5”的情况下,这是网络服务没有访问可执行文件文件夹的权限。由于它是用于开发的,我不想将文件放入文件夹 Program File 而是一个共享文件夹,我可以从开发机器复制文件。赋予网络服务读取/执行/列表的权限就足够了。
  • 我将 LOCAL SERVICE" 和 "NETWORK SERVICE" 添加到我的 bin\Debug 文件夹并且可以正常工作,谢谢!
  • 请注意:如果更改权限不能解决您的问题,请务必检查事件查看器是否有错误。我遇到了一个完全不相关的 SQL 错误,导致服务无法启动,但仍然给我“错误 5:访问被拒绝”。错误。
  • 感谢有关“事件查看器”的注释 - 和我一样,不相关的错误“找不到端点”但伪装成“拒绝访问 (5)”
【解决方案2】:

计算机 -> 管理 -> 服务 -> [您的服务] 属性。 然后是带有帐户信息的选项卡。使用这些设置,例如使用管理员帐户运行服务。

这对我有用。

编辑: 还有一个问题是,大多数服务都以LOCAL SERVICELOCAL SYSTEM 帐户运行。现在,当您使用这些帐户运行C:/my-admin-dir/service.exe 但不允许他们在该目录中执行任何操作时,您将获得error 5。因此,找到该服务的可执行文件,RMB 目录 -> 属性 -> 安全并确保运行该服务的帐户在允许完全控制该目录的用户列表中。

【讨论】:

    【解决方案3】:

    这对我有用。

    1. 右键单击包含服务可执行文件的顶级文件夹。转到属性
    2. 转到“安全”选项卡
    3. 点击“编辑”
    4. 点击“添加”
    5. 输入名称“SYSTEM”,点击确定
    6. 突出显示系统用户,然后单击“完全控制”旁边的允许复选框
    7. 点击确定两次

    【讨论】:

    • “SYSTEM”对我不起作用,我只是赌博并尝试了“SERVICE” - 成功了。
    • 添加“SERVICE”并赋予它“完全控制”对我有用 - Windows 10。
    • 由于我的 ServiceProcessInstaller 的 Account 属性(在我的 ProjectInstaller 中)设置为 LocalService,因此我授予了本地服务帐户的完全权限,这样就成功了!
    【解决方案4】:

    我也遇到了同样的错误,解决了 右键单击服务>属性>登录>登录为:本地系统帐户。

    【讨论】:

    • 谢谢。我的 tor.exe --service start 有问题,现在它就像一个魅力!
    • 为我工作。但是,无论如何以编程方式指定这个?
    • 知道了。右键单击 serviceProcessInstaller -> 属性 -> 帐户并将其设置为“LocalSystem”而不是默认的“用户”。安装服务,瞧。
    【解决方案5】:

    确保Path to executable 指向一个实际的可执行文件(右键单击服务-> 属性-> 常规选项卡)。 通过 powershell(和 sc.exe),您可以安装服务,而无需将其指向实际的可执行文件...啊哈。

    【讨论】:

    • 我不小心留下了一个文件夹而不是 .exe 文件。要解决此问题,我必须“sc delete servicenameXYZ”+ 重新启动服务器以完全删除服务并重新安装正确的服务 .exe 文件。然后它开始像一个魅力。感谢这篇文章。
    • 你救了我!分配文件夹,而不是可执行的完整路径... Arghhhh!应该看起来更好......
    • 这发生在我们所有人身上:)
    【解决方案6】:

    我得到了解决方案:

    1. Go to local service window(where all services found)
    2. Just right click on your service name: 
    3. click on "properties" 
    4. go to "log on" tab
    5. select "local system account"
    6. click "ok"
    

    现在您可以尝试启动该服务。

    【讨论】:

    • 我已经选择了“本地系统帐户”,但仍然收到消息。
    【解决方案7】:

    我收到此错误是因为我误读了此处接受的答案:Create Windows service from executable

    sc.exe create <new_service_name> binPath= "<path_to_the_service_executable>"
    

    对于&lt;path_to_service_executable&gt;,我使用的是可执行文件文件夹的路径,例如C:\Folder.

    必须是可执行文件的路径,例如C:\Folder\Executable.exe.

    【讨论】:

    • 这节省了我数小时的调试和故障排除时间
    • 谢谢!让我烦恼的是,几年前我也遇到过同样的事情。
    【解决方案8】:

    在我的情况下,未检查以下内容。

    【讨论】:

    • 对于像我这样的其他读者:这个截图是服务属性窗口的一部分!打开服务窗口(运行:services.msc)并从右键单击服务后出现的上下文菜单中选择属性!
    • 不是一个通用的解决方案,但可能会给你一个提示
    【解决方案9】:

    如果您的访问被拒绝错误代码 5。那么可能在您的代码中,您的服务正在尝试与系统中的某些文件进行交互,例如写入日志文件

    打开服务属性选择log on选项卡并选中允许服务与桌面交互的选项,

    【讨论】:

      【解决方案10】:

      对我来说 - 运行服务的文件夹以及其中的文件是使用 Windows 的“加密”选项加密的。删除它 - 瞧!

      【讨论】:

      • 这对我来说是个问题——我使用的服务器上的小丑系统管理员转动了一些旋钮,使所有目录默认都具有 NTFS 加密,因此 LocalSystem 实际上没有读取它们的加密密钥...
      【解决方案11】:

      当您的OnStart 方法出现错误时会发生此错误。您不能直接在OnStart 方法中打开主机,因为它在调用时实际上不会打开,而是会等待控件。所以你必须使用一个线程。这是我的例子。

      public partial class Service1 : ServiceBase
      {
          ServiceHost host;
          Thread hostThread;
          public Service1()
          {
              InitializeComponent();
               hostThread= new Thread(new ThreadStart(StartHosting));
      
          }
      
          protected override void OnStart(string[] args)
          {
              hostThread.Start();
          }
      
          protected void StartHosting()
          {
              host = new ServiceHost(typeof(WCFAuth.Service.AuthService));
              host.Open();
          }
      
          protected override void OnStop()
          {
              if (host != null)
                  host.Close();
          }
      }
      

      【讨论】:

        【解决方案12】:

        我使用 OWIN 和 TopShelf 托管了 Windows 服务。 我无法启动它。同样的错误 - “访问被拒绝 5”

        我最终将所有权限都交给了我的 bin/Debug。

        问题仍未解决。

        所以我查看了事件日志,结果发现 Microsoft.Owin.Host.HttpListener 不包含在包含 OWIN 启动类的类库中。

        因此,在开始使用 perms 等之前,请确保检查事件日志以确定根本原因。

        【讨论】:

        • 好点 - “访问被拒绝”错误可能与权限无关;始终在事件查看器中检查应用程序日志。
        • 嗨,我也在检查这个,我从 topshelf 登录到这个的 `.\logs` 路径在哪里,但它不存在
        【解决方案13】:

        就我而言,我必须在安装可执行文件的文件夹中的“组或用户名”列表中添加“经过身份验证的用户”。

        【讨论】:

          【解决方案14】:

          导致此错误的原因之一是您的本地文件夹中的权限不足(经过身份验证的用户)。 授予“经过身份验证的用户”权限 打开文件夹属性中的安全选项卡,编辑并添加“Authenticated Users”组并应用更改。

          完成此操作后,我什至可以通过网络服务帐户运行服务(在此之前我只能使用本地系统帐户运行)。

          【讨论】:

            【解决方案15】:

            右键点击service.msc中的service并选择property

            您将在Path to executable 下看到一个文件夹路径,例如 C:\Users\Me\Desktop\project\Tor\Tor\tor.exe

            导航到 C:\Users\Me\Desktop\project\Tor 并右键单击 Tor。

            选择propertysecurityedit,然后选择add。 在文本字段中输入LOCAL SERVICE,单击确定,然后选中复选框FULL CONTROL

            再次点击add然后输入NETWORK SERVICE,点击ok,勾选FULL CONTROL复选框

            然后点击确定(在底部)

            【讨论】:

              【解决方案16】:

              您的代码可能在不允许启动服务的用户的安全上下文中运行。

              由于您使用的是 WCF,我猜您是在 NETWORK SERVICE 的上下文中。

              见:http://support.microsoft.com/kb/256299

              【讨论】:

              【解决方案17】:

              我使用进程监视器监视了 sppsvc.exe,发现它正在尝试写入 HKEY_LOCAL_MACHINE\SYSTEM\WPA 键。在此键上授予 NETWORK SERVICE 权限后,我能够启动该服务,Windows 突然意识到它再次被激活。

              【讨论】:

                【解决方案18】:

                在服务安装程序中使用 LocalSystem 帐户而不是 LocalService 帐户。

                您可以通过在服务安装程序的设计视图中进行以下更改来执行此操作:
                服务进程安装程序的属性 -> 将帐户设置为 LocalSystem。

                或通过在服务安装程序的 Designer.cs 文件中进行以下更改:

                this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
                

                【讨论】:

                  【解决方案19】:

                  http://www.sysinternals.comProcess Utilities &gt; Process monitor

                  这个工具可以让你监控一个进程做了什么。如果您监视此服务进程,您应该会在某处看到拒绝访问,以及拒绝访问的资源是什么。

                  【讨论】:

                    【解决方案20】:

                    对于错误 5,我做了与上述解决方案相反的操作。 “第一个错误 5:拒绝访问错误已通过将输出目录的权限授予 NETWORK SERVICE 帐户来解决。”

                    我将我的帐户更改为本地帐户,而不是网络服务帐户,因为我是以管理员身份登录的,所以它可以工作

                    【讨论】:

                      【解决方案21】:

                      如果您在服务器机器上遇到此错误,请尝试访问您获得真正 Windows 服务 exe 的文件夹。您应该转到安全选项卡并选择本地服务作为用户,并应授予完全访问权限。您也应该对 exe 执行相同的操作。

                      【讨论】:

                        【解决方案22】:

                        我不小心将我的服务设置为Local service 解决方案是切换到Local System

                        【讨论】:

                          【解决方案23】:

                          在我的桌子上敲了几个小时试图弄清楚这一点后,不知何故我的“主要”方法被清空了它的代码!

                          ServiceBase[] ServicesToRun;
                          ServicesToRun = new ServiceBase[] 
                          { 
                              new DMTestService()
                          };
                          ServiceBase.Run(ServicesToRun);
                          

                          我发现的其他解决方案:

                          • 将 .NET 框架更新到 4.0
                          • 确保 InitializeComponent() 中的服务名称与安装程序服务名称属性匹配

                            private void InitializeComponent()
                            ...
                            this.ServiceName = "DMTestService";
                            
                          • 良好的服务器重启也无妨

                          Szhlopp

                          【讨论】:

                            【解决方案24】:

                            在可能的情况下,系统会耗尽本地磁盘上的可用空间。

                            【讨论】:

                              【解决方案25】:

                              我今天在我正在开发的一项服务中遇到了这个问题,关于这个问题的其他建议都没有奏效。就我而言,我在运行服务的文件夹中缺少 .dll 依赖项。

                              当我添加依赖项后,问题就消失了。

                              【讨论】:

                                【解决方案26】:

                                在我的情况下,我将项目保存在桌面上并访问桌面,我们需要向文件夹添加权限,所以我只是将我的项目文件夹移动到 C:\ 目录,现在它的工作就像一个魅力。

                                【讨论】:

                                  【解决方案27】:

                                  我不知道我的回答对很多人是否有意义,但我也遇到了同样的问题,而且解决方案非常简单。我所要做的就是打开我用来以管理员身份运行代码的程序。 (右键单击 --> 以管理员身份运行)。

                                  仅此而已。

                                  【讨论】:

                                    【解决方案28】:

                                    正如错误弹出窗口所暗示的,这与权限有关。因此,以“LocalSystem”帐户运行该服务。

                                    同样,右键单击serviceProcessInstaller -&gt; Properties -&gt; Account 并将其设置为"LocalSystem",而不是默认的"User"。安装服务,瞧。

                                    【讨论】:

                                    • 这是一个行之有效的修复方法,没有任何变通方法。投反对票的人能否解释一下不喜欢的原因让其他人理解
                                    【解决方案29】:

                                    检查 Windows 事件日志以获取详细的错误消息。我在检查事件日志后解决了同样的问题。

                                    【讨论】:

                                      【解决方案30】:

                                      所有其他答案都谈论权限问题 - 这是有道理的,因为这就是错误消息所指的内容。

                                      但是,就我而言,这是由我的服务代码中的一个简单异常引起的(System.IndexOutOfRangeException,但它可能是任何东西)。

                                      因此,当发生此错误时,应查看其日志并查找异常。

                                      【讨论】:

                                        猜你喜欢
                                        • 2011-04-06
                                        • 2010-10-09
                                        • 1970-01-01
                                        • 2016-10-08
                                        • 2013-12-26
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        相关资源
                                        最近更新 更多