【问题标题】:C# EventLog.Delete Access DeniedC# EventLog.Delete 访问被拒绝
【发布时间】:2017-10-31 12:05:11
【问题描述】:

我已经阅读了关于安全和注册表项的其他关于 SO 的问题,但没有任何东西可以帮助我解决我的特定用例场景。

这是我的场景:

我想做的事

我想在代码中删除 Windows 事件日志。

问题

执行该函数时,我收到 System.ComponentModel.Win32Exception。异常消息是“访问被拒绝”。

我目前的情况

我正在使用我编写的一个模拟函数,它包含 EventLog.Delete 函数,它使我进入一个对 EventLog Registry Hive 具有完全访问权限的用户上下文。随后,我感兴趣的日志也对该特定用户具有完全访问权限。

我的问题

如果我正在运行的用户(通过模拟)具有对相关日志的完全访问权限,为什么我会收到“访问被拒绝”?我已经测试了我的 Impersonation 函数,它对我编写的其他代码按预期工作。我不明白为什么我会因此而被拒绝访问。

在我的模拟功能的另一种情况下,它工作得很好,例如,如果我尝试写入运行程序的用户上下文没有写入权限的文件,那么我将无法写入文本文件,但是,如果我使用我的模拟进入 确实 具有写访问权限的用户上下文,那么它就可以正常工作(我可以写入文件)。所以我只是不明白为什么不能将相同的概念应用于注册表项。

我在这里错过了什么?

守则

  1. 异常消息

  2. 我的测试

其中 sw-test 是我为测试目的而创建的用户,它对我们尝试删除的注册表具有完全访问权限。

        [TestMethod]
        public void DeleteEventLog_ValidatedUser_DeleteLog()
        {
            using (new Impersonator(Environment.UserDomainName, "sw-test", "pswd"))
            {
                Logging logging = new Logging();
                logging.DeleteEventLog("testLog");
            }
        }

【问题讨论】:

    标签: c# security registry impersonation event-log


    【解决方案1】:

    好的,我最终解决了这个问题,这里有两个问题导致上述异常被抛出,它们如下:

    1. Visual Studio 未在管理员模式下运行。

    未在管理员模式下运行 Visual Studio 是问题之一,这似乎与 Windows 操作系统中的访问令牌有关。根据我读到的消息来源,如果我在没有打开 UAC 的情况下运行程序(这是我的场景,我将其关闭),那么正在运行的程序会获得我的访问令牌的副本。但是,如果我启用了 UAC,程序会获取我的访问令牌的副本,但它是受限制的访问令牌。 (见:What precisely does 'Run as administrator' do?) - 老实说,这对我来说没有任何意义,如果我关闭了 UAC,为什么我必须以管理员身份运行?视觉工作室不应该拥有我的访问令牌的不受限制的副本吗?我在管理员组,UAC 关闭...

    2。在模拟中未将 NewCredentials 指定为 Logon32Type

    我不太了解它,但是当我为我的模拟指定这个时,一切都开始完美运行,我阅读了一篇关于它的博客,它谈到了它是如何在 VISTA 时代引入的,以及它是如何主要用于指定出站网络连接到服务器的凭据,主要用于解决服务器端与安全相关的问题。不过,看不到它与与本地事件日志的交互有何关联。 (见:https://blogs.msdn.microsoft.com/winsdk/2015/08/25/logonuser-logon32_logon_new_credentials-what-is-this-flag-used-for/

    代码

                using (new Impersonator(Environment.UserDomainName, "sw-test", "pswd", Advapi32.Logon32Type.NewCredentials))
                {
                    EventLog.CreateEventSource("testSource", "testLog");
                    EventLog.Delete("testLog");
                }
    

    NewCredentials 是 int 9

    【讨论】:

      猜你喜欢
      • 2021-09-18
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多