事件日志写入权限

31

我的问题与写入Windows事件日志的权限有关。 我查看了几篇相关帖子,并找到了一些解决方法,但这些方法都不适用于我的当前情况。

我在.NET 4.0中使用C#。 我使用EventLog类: EventLog class

简而言之,我需要查看是否有一种方法可以模拟或验证经过身份验证的用户和密码,以达到我需要写入事件日志的正确位置。 服务器始终位于Windows Server系列中,但版本可能会有所不同。

我的应用程序是使用以下帐户之一运行的Windows服务:

  • 网络服务
  • 本地服务
  • 本地系统
  • 具有受限权限的用户(Users或Domain Users组)

这里还有一些其他的条件:

  • 我不能将服务用户设置为管理员,甚至不能将其设置为服务器上的本地管理员
  • 我不能编辑或更改注册表
  • 我不能更改UAC或服务器上的任何组策略
  • 我有一个具有管理员权限的用户,但不能用来运行服务
  • 事件日志将始终是本地事件日志,而不是远程计算机上的日志
  • 日志可能总是“应用程序”日志
  • 源可能会有所不同,这似乎是问题的关键

我的问题是:这真的可能吗?

我可以在代码中模拟用户以实现我需要的功能吗? 连接到Web服务,登录SMTP服务器以及当然登录数据库等时,我都这样做。

我遇到了这个类: EventLogPermission Class

但我似乎无法正确理解如何使用这个类。

我希望我已经清楚地表达了我的问题。 由于我的标准,我不认为这是另一篇文章的重复。


5
为什么会有负评?这是一个完全合理的问题。许多需要特殊或管理员权限的功能可以通过代码来模拟,以便服务本身可以作为低特权用户运行。 - Mats Magnem
可能是重复的问题:如何通过命令行创建Windows事件日志源? - jpaugh
虽然它不完全符合您的要求,但是在我看来,这个问题及其答案更加普遍有用。 - jpaugh
2个回答

26
默认情况下,任何经过身份验证的用户都可以写入应用程序事件日志。但是只有管理员可以创建新的事件源。如果在服务安装时已知所有事件源,则建议提前注册这些源,然后您就可以开始了。注册是调用 EventLog.CreateEventSource 的简单过程。
如果您需要更多关于事件源的灵活性,可以自定义权限。可以通过调整注册表键来自定义这些默认值:
  HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog\Application\CustomSD

KB文章所描述的过程。一个wevtutil工具,它是操作系统的一部分,在Server 2008及以上版本中可用,相对于通过regedit进行操作要更加方便一些。


1
关键在于安装时的管理员级别权限,如果您想在默认/安全安全设置下操作,则必须简单地获取此权限。 - pseudocoder
1
我知道这些,这些通常是我做的事情。但两者都不符合我的标准(如问题所述)。我无法编辑或更改注册表。而且我无法提前注册来源,因为我的来源可能会有所不同。 - Mats Magnem
@MatsMagnem,我很确定你可以在服务安装时编辑注册表。当你安装Windows服务时,你需要管理权限,因此你可以一边调整权限,一边进行修改。一旦完成,你的服务正在运行,就不需要再修改注册表了。 - seva titov
2
我当然可以,并且如果必须要这么做,我会愿意。但是这是一个销售给客户自行安装的产品。由于政策和政治原因,大多数政府和公司客户通常不会授予我具有管理员权限的用户。安装本身不需要管理员权限,解决方案的整体运行也不需要。所以这不是我的选择。如果必须要这么做,我会愿意。但是,如果通过模拟用户来避免(这是可以的,因为他们可以在安装后设置用户名和密码),那就太好了 :-) - Mats Magnem
1
@MatsMagnem,安装本身不需要管理员权限--这是不正确的,要安装Windows服务,您需要在计算机上拥有管理员权限。 - seva titov
显示剩余4条评论

2
答案显示为“否”。 我意识到没有解决这个问题的好方法,必须手动完成。 因此,我为这种情况选择的解决方案是,无法以管理员身份运行服务或进行手动注册表编辑的客户无法使用与记录事件日志相关的功能。我将使其可以从配置中启用和禁用日志记录。 管理员用户和注册表编辑是我知道的方法,但正如所述,这次我试图避免这种情况。但根据我的标准,这似乎不可能。

2
-1:要从您的代码修改注册表,请在安装过程中使用Windows注册表API。它并不需要手动进行。 - seva titov
其他建议描述了手动编辑,并没有回答我的具体问题。它们是替代方法,而不是我所问的内容。 - Mats Magnem
如前所述,您可以编写一个安装程序组件,使其在安装服务时自动添加事件源(并在卸载时删除它)。您承认安装必须由具有管理员权限的用户完成,因此显然有解决方案,因此“答案”被否决。 - Peter
@Peter,有趣的方法,你应该把它发布为答案。 - user3794166

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接