System.Security.SecurityException:找不到源,但无法搜索部分或全部事件日志。无法访问的日志:安全性

时间:2011-04-28 17:01:37

标签: c# windows windows-services

我正在尝试创建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();
    }
}

7 个答案:

答案 0 :(得分:169)

在Windows 7中使用installutil时尝试从命令行安装服务时遇到了同样的异常。解决方法是以管理员身份打开命令行,然后运行installutil。

此外,您可能会发现使用TopShelf等框架来托管服务更容易,因为它可以管理服务名称和描述中的所有setup configuration以及恢复过程的工作方式。它还允许您在调试时从IDE内部轻松启动服务。

答案 1 :(得分:48)

以管理员身份运行命令提示符。 它将解决您的问题

答案 2 :(得分:35)

以管理员身份运行

这是程序员遗漏的一个非常常见的问题

答案 3 :(得分:9)

我通过打开具有管理权限的VS2013开发者控制台解决了同样的问题。

答案 4 :(得分:6)

您可能正在尝试使用

安装服务
  1. 没有足够权限的用户帐户 或者
  2. 具有管理员权限但未在“管理员模式”中运行命令提示符的用户。
  3. 具体来说,在这种情况下的问题是在服务安装期间创建一些EventLog注册表项。

    解决此问题的一种方法是确保以管理员模式运行命令提示符。 (右键单击>以管理员身份运行)

    我还遇到过一些情况,由于某些注册表项没有“完全控制”,因此该方法仍然无法解决 SecurityException 问题。管理员帐户的权限。

    以下按键应具有“完全控制”功能。为管理员设置,以便服务能够写入EventLog:

    HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\事件日志 HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\事件日志\应用

    这可以通过以下方式完成:

    1. 调用Windows注册表编辑器
      • 运行[Win + R]
      • 输入' regedit'
    2. 导航至上面列出的路径
    3. 右键单击所需路径
    4. 确保为管理员选中读取完全控制权限复选框
    5. 点击应用确定
    6. 对其他路径重复相同的过程

答案 5 :(得分:4)

如果系统提示您输入用户名和密码,那么某处某处设置为Account = ServiceAccount.User - 这是可能(应该)发生的唯一方式。也许你上面评论中的代码没有被执行,或者后来执行代码会改变它。

就你的第二段而言,一般来说,如果你不希望它在控制台上看到或作为一项任务运行,我认为服务就可以了。我不确定我是否理解将其作为ASP.NET运行并让它不允许您查看数据库的部分...

最后,在你的最后一段中,我不能在不了解安装程序代码中发生的事情的情况下与NullExeception说话。

答案 6 :(得分:0)

我在尝试测试EventLog的存在时遇到此错误(在OP中)

   if (!EventLog.SourceExists("applicatioName"))
         EventLog.CreateEventSource("applicatioName", "Application");

以管理员身份运行VisualStudio解决了该问题。