System.Security.SecurityException:没有找到源,但是无法搜索到部分或全部事件日志.不可访

本文关键字:搜索 全部 事件 日志 SecurityException Security System | 更新日期: 2023-09-27 17:53:51

我正在尝试创建一个Windows服务,但是当我尝试安装它时,它回滚给我这个错误:

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

我不知道这是什么意思——我的应用程序只有最低限度,因为我只是先测试一下。

My Installer Code:

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

System.Security.SecurityException:没有找到源,但是无法搜索到部分或全部事件日志.不可访

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

另外,你可能会发现使用像TopShelf这样的框架来托管你的服务更容易,因为它管理从服务的名称和描述到恢复过程如何工作的所有设置配置。它还允许在调试时从IDE内部轻松启动服务。

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

以管理员身份运行

您可能正在尝试使用

安装服务
  1. 权限不足的用户帐户或
  2. 具有管理员权限的用户,但没有在"管理员模式"下运行命令提示符。

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

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

我也遇到过一些情况,这种方法仍然无法解决SecurityException问题,由于一些注册表项没有管理员帐户的"完全控制"权限。

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

HKEY_LOCAL_MACHINE ' SYSTEM ' CurrentControlSet ' '事件日志服务HKEY_LOCAL_MACHINE ' SYSTEM ' CurrentControlSet ' '服务应用程序事件日志'

可以这样做:

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

我通过使用管理权限打开VS2013 Developer Console来解决同样的问题。

如果提示您输入用户名和密码,那么某个地方的某个东西被设置为Account = ServiceAccount.User -这是唯一可能(应该)发生的方式。也许上面注释中的代码没有被执行,或者被后面执行的代码修改回来了。

至于你的第二段,一般来说,我认为如果你不想让它在控制台上被看到或作为任务运行,那么服务就可以了。我不确定我是否理解关于运行它作为ASP的部分。. NET并让它不允许您查看数据库…

最后,在你的最后一段,我不能说话的NullExeception不知道更多关于什么是发生在你的安装程序的代码

在尝试测试EventLog是否存在时,我得到了这个错误(上面的OP)

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

以管理员身份运行VisualStudio已解决此问题。

在我的情况下,我在ProjectInstaller类中有一个问题,我试图改变服务的属性,一旦编码错误,这个属性就会产生对象引用错误。一旦我得到了正确的代码,System.Security.SecurityException错误就解决了。