PerformanceCounter之拒絕存取登錄機碼Global問題

今天寫一隻利用System.Diagnostics.PerformanceCounter來取出CPU、RAM的各式資訊程式,在部署到ASP.NET IIS後,突然畫面出現經典的黃底紅字,心想這下又不妙了!畫面中出現下列資訊:「拒絕存取登錄機碼'Global'」(Access To The Registry Key Global Is Denied)。當然,馬上就把關鍵字丟到Google找出一堆人在討論這個問題,所有的人也都提到去註冊檔改一下權限就可以動了,那為何我的就是怎麼改怎麼不能動呢?原本該加的身分都加了,甚至不應該加的「Network Service」、「IUSER_XXXX」都加了,依然沒用。

經過一番努力,在這裡公開解決辦法

Step 1. 打開你的IIS Manager,去應用程式集區找出你正在運行的Pool,然後點選進階設定,找到「識別」這個欄位正在運行的身分。大部份的人都是用預設值,但是因為我的伺服器在整體的架構上有特殊的應用,所以我獨立一個伺服器身分在上面運行,假設這個使用者名稱叫作「a」。

Step 2. 這個步驟就是全部的網站中都沒告訴你的真象,你應該把這個使用者「a」加入到一個叫「Performance Monitor Users」的群組之中,這群組在幹嘛的請自己看一下英文字就知道了!

Step 3. 這個步驟所有的網站都會講,打開你的註冊檔編輯器(Windows+R > regedit),然後找到機碼如下:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurePipeServers\winreg

在winreg上按右鍵,選「使用權限」,將使用者「a」加進去後,把權限設定成「讀取」。

Step 4. 再度回到IIS Manager,把你的AppPool重新啟動(或者回收),接著跑去瀏覽器驗證一下,錯誤應該要消失嘍!

ASP.NET C# CPU RAM System.Diagnostics.PerformanceCounter AccessToTheRegistryKeyGlobalIsDenied