我已经阅读了有关安全性和注册表项的其他问题,没有任何帮助我解决我的特定用例场景。
这是我的情景:
我正在尝试做什么
我想在代码中删除一个Windows事件日志。
问题
执行该函数时,我收到System.ComponentModel.Win32Exception。异常消息是"访问被拒绝"。
我目前的工作方式
我正在使用我编写的模拟器函数,它包装了EventLog.Delete函数,它将我放入一个用户上下文,该用户上下文可以完全访问EventLog Registry Hive。随后,我感兴趣的日志也可以完全访问此特定用户。
我的问题
为什么我会收到"访问被拒绝"如果我正在运行的用户(通过模拟)可以完全访问相关日志?我已经测试了我的模拟功能,它可以像我预期的其他代码一样运行。我不知道为什么我会因此拒绝访问。
在我的模拟函数的另一个场景中它工作得很好,例如,如果我试图写一个文件,运行该程序的用户上下文没有写入权限,那么我将无法写入文本文件,但是如果我使用我的模拟放入 具有写访问权限的用户上下文,那么它可以正常工作(我可以写入该文件)。所以我只是不明白为什么同样的概念不能应用于注册表项。
我在这里缺少什么?
守则
答案 0 :(得分:0)
好吧我终于搞清楚这个问题,这里有两个问题导致提到的异常被抛出,它们如下:
<强> 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