2017-05-30 183 views
1

我已閱讀關於安全和註冊表項的其他問題,沒有任何東西幫助我解決特定的用例場景。C#EventLog.Delete訪問被拒絕

這裏是我的情況:

我正在嘗試做

我想,在代碼中,刪除Windows事件日誌。

的問題

當執行功能時,收到一個System.ComponentModel.Win32Exception。異常消息是「訪問被拒絕」。

如何我這樣做目前

我使用,我寫了一個模仿功能,圍繞EventLog.Delete功能包,它丟棄我到具有完全訪問的EventLog註冊表配置單元用戶上下文。隨後我感興趣的日誌也可以完全訪問此特定用戶。

我的問題

爲什麼我收到「訪問被拒絕」如果我下運行的用戶(通過模擬)具有完全訪問日誌中的問題?我測試了我的模擬功能,並且按照我寫的其他代碼的預期工作。我不明白爲什麼我會因此拒絕訪問。

在我的模擬功能的另一種情況下,它工作得很好,例如,如果我試圖寫入文件,運行該程序的用戶上下文沒有寫入權限,那麼我將無法寫入到文本文件,但是如果我使用我的模擬放入確實具有寫訪問權限的用戶上下文,那麼它工作得很好(我可以寫入文件)。所以我只是不明白爲什麼相同的概念不能應用於註冊表項。

我在這裏錯過了什麼?

守則

  1. 異常消息 Access Denied exception Deleting EventLog

  2. 我的測試

當SW-測試是我用於測試目的創建了一個用戶,它具有完全訪問我們試圖刪除的註冊表的權限。

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

回答

0

好吧,我終於得到周圍搞清楚了這一點,有在這裏打球的兩個問題是造成了被拋出的異常提到,有如下幾點:

1的Visual Studio未運行在管理員模式下。

不以管理員模式運行visual studio是問題的一部分,這似乎與Windows操作系統中的訪問令牌相關聯。根據我讀的一個消息來源,如果我運行一個沒有UAC的程序(這是我的場景,我已經關閉了),那麼正在運行的程序會獲取我的訪問令牌的副本。但是,如果啓用了UAC,程序會獲取我的訪問令牌的副本,但它是受限的訪問令牌。 (請參閱:What precisely does 'Run as administrator' do?) - 說實話,這對我來說並沒有什麼意義,如果我將UAC關閉,爲什麼我必須以管理員身份運行? Visual Studio不應該有我的訪問令牌的不受限制的副本?我與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