错误5:启动Windows服务时访问被拒绝

123

我在尝试启动一个我用C#创建的Windows服务时遇到了这个错误:

alt text

我的代码如下:

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 账户授予权限来解决上面的问题,但现在我又遇到了另一个问题:

alt text

更新 #2

无法启动服务。System.InvalidOperationException: Service 'RightAccessManagementWcf.RightAccessWcf' 没有任何应用程序 (非基础结构) 端点。这可能是因为找不到您的应用程序的配置文件,或者由于在配置文件中找不到与服务名称匹配的服务元素,或者由于在服务元素中未定义任何端点。 在 System.ServiceModel.Description.DispatcherBuilder.EnsureThereAreNonMexEndpoints(ServiceDescription description) 在 System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost) 在 System.ServiceModel.ServiceHostBase.InitializeRuntime() 在 System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) 在 System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) 在 RightAccessHosting.RightAccessHost.OnStart(String[] args) in C:\Users....


2
你的第二个问题仅凭那个信息很难解决。你需要查看事件日志,看看真正的错误是什么。 - Matt Ellen
1
检查系统账户是否有访问该文件夹的权限。 - NoWar
32个回答

130

我知道这篇文章比较旧,但是没有标记的解决方案,我想分享一下我是如何解决这个问题的。

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

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

在我的情况下,是因为 app.config 中的服务配置设置有问题。


8
我通过在资源管理器中导航到文件夹,右键点击,选择“属性”,再选择“安全性”,然后在用户列表中为NETWORK SERVICE账户分配正确的权限,对权限进行了修改。 - Justin Skiles
在我的情况下,“错误5”,是因为网络服务没有访问可执行文件所在文件夹的权限。由于这是用于开发,我不想将文件放入Program File文件夹,而是想要一个共享文件夹,可以从开发机器上复制文件。给予网络服务读取/执行/列出的权限应该足够了。 - ZZZ
7
我将“LOCAL SERVICE”和“NETWORK SERVICE”添加到我的bin\Debug文件夹中,现在它可以正常工作了,谢谢! - Hernaldo Gonzalez
4
注意:如果更改权限无法解决您的问题,请务必检查事件查看器以查找错误。我曾经遇到过一个完全不相关的 SQL 错误,它阻止了服务启动,但仍然给出了“错误 5:拒绝访问”的错误提示。 - dtryan
谢谢提醒关于“事件查看器” - 我也遇到了同样的问题,“终结点未找到”的错误,但被伪装成“拒绝访问(5)”。 - David Votrubec
我无法将LOCAL SERVICENETWORK SERVICE添加到我的bin\Debug文件夹中,因为我的解决方案在Google Drive文件流中。所以我需要将我的项目移动到本地磁盘上,现在一切都好了。顺便说一句,这不是我在使用Visual Studio时第一次遇到Google Drive文件流的问题 = / - Daniel Bonetti

32

电脑 -> 管理 -> 服务 -> [你的服务] 属性。然后是带有帐户信息的选项卡。调整这些设置,比如使用管理员帐户运行服务等。

这对我来说可行。

编辑:

还可能出现的问题是,大多数服务都以“LOCAL SERVICE”或“LOCAL SYSTEM”帐户运行。当您使用这些帐户运行“C:/my-admin-dir/service.exe”,但它们没有权限执行该目录中的任何内容时,您将收到“错误5”。因此,请找到服务的可执行文件,右键单击该目录 -> 属性 -> 安全性,并确保服务所运行的帐户在允许完全控制该目录的用户列表中。


24

这对我有用。

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

14
“SYSTEM”对我没有用,我只是赌了一把尝试了“SERVICE”,结果成功了。 - Exter
7
将“SERVICE”添加并授予其“完全控制”对我有效 - Windows 10。 - Fredrik
由于我的ProjectInstaller中的ServiceProcessInstaller的Account属性设置为LocalService,因此我授予了Local Service帐户完全权限,这样就解决了问题! - Dave

20

确保 可执行文件路径 指向实际的可执行文件(右键服务 -> 属性 -> 常规选项卡)。 通过 PowerShell (和 sc.exe),您可以安装一个服务,而不需要指向实际的可执行文件... 啊咳咳。


2
我不小心留下了一个文件夹,而不是.exe文件。为了解决这个问题,我不得不执行"sc delete servicenameXYZ" + 重启服务器来完全删除服务并重新安装正确的服务.exe文件。然后它就像魔术般地开始运行了。感谢您的帖子。 - Honza P.
你救了我!应该分配文件夹而不是可执行文件的完整路径...啊!应该仔细看看... - ilter
这种情况发生在我们所有人身上 :) - hector-j-rivas
是的,我没有把 exe 文件放在服务安装路径中。谢谢。 - Datboydozy

17

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


谢谢。我之前在运行tor.exe --service start时遇到了问题,现在已经完美解决了! - Arman Karimi
对我来说有效。不过,有没有办法以编程的方式指定这个呢? - Sisir
明白了。右键 serviceProcessInstaller -> 属性 -> 账户,将其设置为“LocalSystem”,而不是默认的“User”。安装服务,完成。 - Sisir

17

我之所以出现这个错误,是因为我误读了这里接受的答案:从可执行文件创建Windows服务

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

对于<path_to_service_executable>,我使用的是可执行文件所在文件夹的路径,例如:C:\Folder

它需要是可执行文件的路径,例如:C:\Folder\Executable.exe


这节省了我数小时的调试和故障排除。 - kolexinfos
谢谢!让我困扰的是,几年前我也遇到了同样的问题。 - Steve

11

我有解决方案:

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"

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


3
我已经选择了“本地系统帐户”,但仍然收到该消息。 - user2568374

7
在我的情况下,以下内容没有被勾选:

enter image description here


3
对于像我这样的其他读者:此屏幕截图是服务属性窗口的一部分!打开服务窗口(运行:services.msc),并在右键单击服务后出现的上下文菜单中选择“属性”! - MohaMad
这不是一个通用的解决方案,但可能会给你一些提示。 - Henry Troup

4
如果您遇到访问拒绝错误代码5,则可能是因为您的服务在尝试与系统中的某些文件交互,比如写入日志文件。
打开服务属性,选择“登录”选项卡,并勾选允许服务与桌面交互的选项。 click allow service to interact with desktop

3
这个错误的一个原因是您本地文件夹中权限不足(已认证用户)。为了给“已认证用户”授权,请打开文件夹属性的安全选项卡,编辑并添加“已认证用户”组,然后应用更改。
完成这些步骤后,即可通过网络服务帐户运行服务(在此之前,我只能使用本地系统帐户运行)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接