错误5:启动Windows服务时访问被拒绝
当我尝试启动在C#中创build的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'具有零应用程序(非基础设施)终结点。 这可能是因为没有为您的应用程序findconfiguration文件,或者是因为在configuration文件中找不到匹配服务名称的服务元素,或者是因为服务元素中没有定义端点。 System.ServiceModel.ServiceModel.ServiceHostBase.OnOpen()上的System.ServiceModel.ServiceHostBase.InitializeRuntime()中System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription说明,ServiceHostBase serviceHost)上的System.ServiceModel.Description.DispatcherBuilder.EnsureThereAreNonMexEndpoints(ServiceDescription说明) TimeSpan超时)在System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan超时)在RightAccessHosting.RightAccessHost.OnStart(String [] args)在C:\用户….
我意识到这个post是旧的,但没有明显的解决scheme,我只是想抛出我如何解决这个问题。
第一个Error 5: Access Denied
错误是通过给输出目录授予NETWORK SERVICE
帐户来解决的。
第二个Started and then stopped
错误似乎是一个通用的消息,当有问题的服务。 检查事件查看器(特别是“Windows日志”>“应用程序”)的真实错误消息。
在我的情况下,这是在app.config中的一个糟糕的服务configuration设置。
计算机 – >pipe理 – >服务 – > [你的服务]属性。 然后与帐户信息的选项卡。 玩这些设置,比如用pipe理员帐号等运行服务。
这是为我做的。
编辑:什么也可以是这个问题是,大多数服务作为LOCAL SERVICE
或LOCAL SYSTEM
帐户运行。 现在,当您使用这些帐户运行C:/my-admin-dir/service.exe
,但不允许在该目录中执行任何操作时,您将收到error 5
。 因此,find服务的可执行文件,目录 – >属性 – >安全性,并确保服务运行的帐户位于可以完全控制目录的用户列表中。
这对我有效。
- 右键单击包含服务可执行文件的顶级文件夹。 去属性
- 转到“安全”选项卡
- 点击“编辑”
- 点击“添加”
- input名称“SYSTEM”,点击OK
- 突出显示系统用户,然后单击允许旁边的“完全控制”checkbox
- 单击确定两次
我也得到了同样的错误,它通过右键单击服务>属性>login>login为:本地系统帐户解决。
确保Path to executable
指向一个实际的可执行文件(右键单击服务 – >属性 – >常规选项卡)。 通过powershell(和sc.exe),你可以安装一个服务,而不指向一个可执行文件…嗯。
当您的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(); } }
对于我来说,运行服务的文件夹及其中的文件是使用Windows“encryption”选项encryption的。 删除,瞧!
您的代码可能在不允许启动服务的用户的安全上下文中运行。
由于您正在使用WCF,我猜测您正处于NETWORK SERVICE环境中。
请参阅: http : //support.microsoft.com/kb/256299
从http://www.sysinternals.com查看;Process Utilities > Process monitor
。
这是一个工具,可以让你监视一个过程是什么。 如果你监视这个服务进程,你应该看到一个拒绝访问的地方,以及拒绝访问的资源。
在我的情况下,没有检查。
对于错误5,我做了上述解决scheme的相反。 “第一个错误5:访问被拒绝错误是通过给NETWORKSERVICE帐户授予对输出目录的权限解决的。”
我更改为本地帐户,而不是networking服务帐户,因为我是以pipe理员身份login的
如果你在服务器机器上得到这个错误,请尝试访问你得到真正的Windows服务exe文件夹。 您应该转到安全选项卡并select本地服务作为用户,并应提供完全访问权限。 你也应该为exe文件做同样的事情。
我使用进程监视器监视sppsvc.exe,发现它试图写入HKEY_LOCAL_MACHINE \ SYSTEM \ WPA密钥。 在给这个密钥NETWORK SERVICE的权限之后,我能够启动这个服务,Windows突然意识到它被再次激活了。
我无意中将我的服务设置为以Local service
解决scheme切换到Local System
在将我的桌子撞到我的桌子上几个小时后,试图弄清楚这一点,不知何故,我的“主”方法已经清空了它的代码!
ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new DMTestService() }; ServiceBase.Run(ServicesToRun);
我发现的其他解决scheme
- 将.NET框架更新到4.0
-
确保InitializeComponent()中的服务名称与安装程序服务名称属性匹配
private void InitializeComponent() ... this.ServiceName = "DMTestService";
-
而一个很好的服务器重新启动不会伤害
Szhlopp
在这种情况下,系统可能会耗尽本地磁盘上的可用空间。
我今天在这个问题上有了一个我正在开发的服务,在这个问题上没有任何其他的build议。 在我的情况下,我在服务运行的文件夹中有一个缺less的.dll依赖项。
当我添加依赖关系时,问题就消失了。
我有使用OWIN和TopShelf托pipe的Windows服务。 我无法启动它。 同样的错误 – “拒绝访问5”
我结束了所有的烫发到我的斌/debugging。
问题仍未解决。
所以我看了一下事件日志,结果发现Microsoft.Owin.Host.HttpListener
没有包含在包含OWIN启动类的类库中。
因此,请确保在开始进入烫发之前查看事件日志以确定根本原因。
在我的情况下,我保持在桌面上的项目,并访问桌面,我们需要添加权限的文件夹,所以我只是将我的项目文件夹移动到C:\目录,现在它的工作就像一个魅力。
在Service Installer中使用LocalSystem帐户而不是LocalService帐户。
您可以通过在服务安装程序的devise视图中进行更改来做到这一点:
服务进程安装程序的属性 – >将帐户设置为LocalSystem。
或者通过在您的服务安装程序的designer.cs文件中进行以下更改:
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
如果你有一个访问被拒绝的错误代码5.那么可能在你的代码中你的服务试图与系统中的某些文件进行交互,如写入日志文件
打开服务属性select“ log on
选项卡,然后选中允许服务与桌面交互的选项,
右键单击service.msc中的服务并selectproperty
。
您将在C:\ Users \ Me \ Desktop \ project \ Tor \ Tor \ tor.exe之类的Path to executable
文件path下看到文件夹path
导航到C:\ Users \ Me \ Desktop \ project \ Tor并右键单击Tor。
selectproperty
, security
, edit
,然后add
。 在文本框中inputLOCAL SERVICE
,点击ok,然后选中FULL CONTROL
再次点击add
,然后进入NETWORK SERVICE
,点击ok
,勾选FULL CONTROL
然后点击确定(在底部)
我在一个我正在部署的服务上遇到了这个问题,在这个问题上没有任何其他的build议。 在我的情况下,这是因为我的.config(xml)无效。 从qualif复制到prod时,我做了一个复制和粘贴错误。
单击Start
菜单并selectRun
或使用Win + R的键盘快捷键。
在对话框中,键入lusrmgr.msc
。 当此应用程序打开时,单击左侧面板中的用户,然后右键单击右侧面板中的Administrator
。 点击菜单中的Properties
。
在“ Administrator Properties
对话框中,select“ Member Of
选项卡,然后单击右下angular的“添加…”button。 从下一个对话框中selectAdvanced...
另一个对话框将出现。 从那里点击右侧的Find Now
。 search结果列表将显示在对话框的底部。 从此列表中selectNetwork Services
,然后在每个打开的对话框上单击OK
。