System.Security.SecurityException:找不到源,但是无法搜索某些或所有事件日志。无法访问的日志:安全性


72

我正在尝试创建Windows服务,但是当我尝试安装它时,它会回滚并出现以下错误:

System.Security.SecurityException:找不到源,但是无法搜索某些或所有事件日志。不可访问的日志:安全性。

我不知道这意味着什么-我的应用程序只有最低要求,因为我只是先进行测试。

我的安装程序代码:

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();
    }
}

2
“我将“帐户”和“密码”均设置为null,并将“帐户”设置为本地系统。” -如何将相同的属性设置为两个不同的东西?
qJake 2011年

`processInstaller.Account = ServiceAccount.LocalSystem; processInstaller.Username = null; processInstaller.Password = null; `
michelle

对不起,我没有注意到我说过两次帐户:/
michelle

也许如果您发布了一些代码,我们也许可以为您提供帮助。
马克·克拉姆

10
尝试以管理员权限运行“ installUtil”命令。
Corstian Boerman'2

Answers:


4

如果提示您输入用户名和密码,则将某处设置为Account = ServiceAccount.User-这是(应该)发生的唯一方法。也许上面注释中的代码没有被执行,或者被以后执行的代码改回了。

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

最后,在您的最后一段中,如果您不了解安装程序代码中发生的一切,我将无法与NullExeception交流。


至于第二段,我有很多代码正在处理,正如我提到的那样,它提取rss提要,收集数据,解析并将其存储到数据库中。我有一个ASP.NET Web应用程序,因为我为用户提供了一个界面,以便他/她可以基于数据库中的数据查看建议。如果有更好的方法可以在ASP.NET中使用后台进程,我很乐意选择该方法。是否有办法?
michelle

@michelle,尝试删除三行代码设置AccountUsernamePassword。我猜想这是在安装程序查看属性并看到默认值之后调用的ServiceAccount.User,然后要求提供凭据,然后用null覆盖它。尝试在属性页上进行设置。只是在黑暗中刺伤。
吉姆(Jim)

1
@michelle,至于您评论的另一部分,您提到过有关在ASP.NET中运行“后台进程”。抱歉,这超出了我的专业知识。 如果您想做的事情可以完成,则可能需要AJAX。AJAX提供了更丰富的Web UI体验(例如,当您在结果中键入内容时,Google Maps使用AJAX,可能还使用了Google搜索)。您可能会有更好的运气开始一个新问题,该问题被专门标记为该问题。
吉姆(Jim)

188

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

另外,您可能会发现使用TopShelf之类的框架托管服务会更容易,因为它可以管理所有设置配置,从服务的名称和描述到恢复过程的工作方式。它还可以在调试时从IDE内部轻松启动服务。


3
这是我的解决办法。干杯。
约翰,

1
简直不敢相信这件事发生在我身上。再次!
ilans 2014年

4
理想情况下,应将其设置为答案!:)
Amogh Natu 2015年

这是我的问题。一项服务很好,但安装第二项失败。
亚当·贝努瓦


39

以管理员身份运行

这是程序员经常错过的一个非常普遍的问题


1
我浪费了2个小时。谢谢!
哈比卜


8

您可能正在尝试使用安装服务

  1. 没有足够权限的用户帐户,或者
  2. 具有管理员权限但未在“管理员模式”下运行命令提示符的用户。

具体来说,这种情况下的问题是在服务安装期间创建了一些EventLog注册表项。

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

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

以下密钥应为管理员设置“完全控制”,以便该服务能够写入EventLog:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ EventLog \ Application

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

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

1

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.