小功能隱藏着大學問---windows的ACL帶來的挑戰

     
爲何說這個功能小呢?
1.此功能只是在用戶裝了某一軟件時才用得着,用戶裝這個軟件的可能性很小;
2.此功能只須要修改一處註冊表鍵值;

   因而這樣簡單實現了:
   在一個windows服務程序中調用一個修改註冊表鍵值的方法進行修改,單元測試,這個方法很成功。可是在以服務運行的方式進行的測試中,打開此處註冊表的方法一直報「找不到註冊表路徑」的錯誤。諸位看官,此處註冊表的根鍵爲HKEY_CURRENT_USER,你們明白爲何了嗎?
 
   「 是的,與windows的ACL有關,windows服務是以系統權限運行的,在系統權限中,沒有HKEY_CURRENT_USER這個鍵。」

解決方案:
1.操做HKEY_USERS
    HKEY_USERS這個根鍵但是包含了全部用戶的一些信息的,和相應的HKEY_CURRENT_USER恰好一一對應,並且咱們要操做的Software鍵就在其中,因而就利用他來對每個用戶的Software鍵下的某個鍵值進行操做。可是咱們這個功能得考慮一點,用戶一旦裝上這個軟件後就會在Software鍵下建立某一鍵,而咱們必需要在短期內改寫此處鍵的某個值,可是咱們根本不知道用戶何時裝啊!

2.註冊表監控
     RegNotifyChangeKeyValue這個方法恰好能知足咱們,利用windows的消息機制咱們能夠作到實時監控各個USER下的註冊表改變狀況,而後利用回調函數來實現修改相應的鍵值。可是當嘗試監控Software鍵變化時,發現Software鍵一直有變化的消息,頻繁到感受只有1秒。想一想咱們總不至於這麼頻繁的操做註冊表吧。

3.設置定時器
  可是咱們能夠這樣作,採用輪詢的方式遍歷HKEY_USERS下每個用戶,而後嘗試打開咱們要操做的鍵值,若是不能打開說明此用戶未安裝此軟件,反之用戶必定安裝了此軟件,咱們就能夠改寫此鍵值來實現咱們的功能。定時器的值咱們能夠本身設定,至少不用那麼頻繁的去操做註冊表了。

(思考:關於權限這一塊windows提供了方法能夠模仿當前用戶權限)
相關文章
相關標籤/搜索