我正在尝试创建Windows服务,但是当我尝试安装它时,它会回滚给我这个错误:
System.Security.SecurityException:The 找不到来源,但部分或全部 无法搜索事件日志。 无法访问的日志:安全性。
我不知道这意味着什么 - 我的应用程序是最小的,因为我只是先测试一下。
我的安装员密码:
namespace WindowsService1
{
[RunInstaller(true)]
public partial class ProjectInstaller : System.Configuration.Install.Installer
{
public ProjectInstaller()
{
//set the privileges
processInstaller.Account = ServiceAccount.LocalSystem;
processInstaller.Username = null;
processInstaller.Password = null;
serviceInstaller.DisplayName = "My Service";
serviceInstaller.StartType = ServiceStartMode.Manual;
//must be the same as what was set in Program's constructor
serviceInstaller.ServiceName = "My Service";
this.Installers.Add(processInstaller);
this.Installers.Add(serviceInstaller);
}
private void serviceProcessInstaller1_AfterInstall(object sender, InstallEventArgs e)
{
}
private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
{
}
}
}
我的服务代码:
public partial class Service1 : ServiceBase
{
public Service1()
{
this.ServiceName = "My Service";
}
protected override void OnStart(string[] args)
{
base.OnStart(args);
}
protected override void OnStop()
{
base.OnStop();
}
}
答案 0 :(得分:169)
在Windows 7中使用installutil时尝试从命令行安装服务时遇到了同样的异常。解决方法是以管理员身份打开命令行,然后运行installutil。
此外,您可能会发现使用TopShelf等框架来托管服务更容易,因为它可以管理服务名称和描述中的所有setup configuration以及恢复过程的工作方式。它还允许您在调试时从IDE内部轻松启动服务。
答案 1 :(得分:48)
以管理员身份运行命令提示符。 它将解决您的问题
答案 2 :(得分:35)
这是程序员遗漏的一个非常常见的问题
答案 3 :(得分:9)
我通过打开具有管理权限的VS2013开发者控制台解决了同样的问题。
答案 4 :(得分:6)
您可能正在尝试使用
安装服务具体来说,在这种情况下的问题是在服务安装期间创建一些EventLog注册表项。
解决此问题的一种方法是确保以管理员模式运行命令提示符。 (右键单击>以管理员身份运行)
我还遇到过一些情况,由于某些注册表项没有“完全控制”,因此该方法仍然无法解决 SecurityException 问题。管理员帐户的权限。
以下按键应具有“完全控制”功能。为管理员设置,以便服务能够写入EventLog:
HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\事件日志 HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\事件日志\应用
这可以通过以下方式完成:
答案 5 :(得分:4)
如果系统提示您输入用户名和密码,那么某处某处设置为Account = ServiceAccount.User
- 这是可能(应该)发生的唯一方式。也许你上面评论中的代码没有被执行,或者后来执行代码会改变它。
就你的第二段而言,一般来说,如果你不希望它在控制台上看到或作为一项任务运行,我认为服务就可以了。我不确定我是否理解将其作为ASP.NET运行并让它不允许您查看数据库的部分...
最后,在你的最后一段中,我不能在不了解安装程序代码中发生的事情的情况下与NullExeception说话。
答案 6 :(得分:0)
我在尝试测试EventLog的存在时遇到此错误(在OP中)
if (!EventLog.SourceExists("applicatioName"))
EventLog.CreateEventSource("applicatioName", "Application");
以管理员身份运行VisualStudio解决了该问题。