在Windows 8中,要透過檔案總管手動將DLL拉進GAC「C:\Windows\assembly」之中,為何會出現Access is denied呢?
遭遇環境:Windows 8,Windows 8.1
同事問說手動要將DLL安裝到GAC之中,本來要透過「檔案總管」將DLL直接拉進「C:\Windows\assembly」的目錄之中,結果卻發生「Access is denied: 'xxx.dll'.」的錯誤,如下圖所示,
想說會是因為檔案總管不是用系統管理者身份開啟所以沒權限嗎?
所以就以系統管理者身份開啟命令視窗,然後再輸入2次 explorer ,開啟2個檔案總管,然後將DLL拉進去試看看,還是不行!
那只好使用 gacutil.exe 來安裝(如果有安裝VS.NET的話,可以Search C:\Program Files (x86)目錄,筆者是在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin目錄之中)。
如果客戶那沒有 gacutil.exe 呢? 您可以將您機器上的 gacutil.exe 及 gacutil.exe.config Copy過去。
安裝方式一樣是以系統管理者身份開啟VS.NET命令視窗,然後切到要DLL的所在目錄,輸入 gacutil /i [DLL FileName]
因為要安裝的DLL蠻多的,一個一個輸入還蠻累的,所以筆者的方式是將 gacutil.exe 及 gacutil.exe.config Copy到那些要安裝到GAC的DLL目錄之中。
然後建立BAT檔(regGAC.bat),如下,
rem Change to DLL's Disk
[DLL's Disk, 如E:]
rem Change to DLL Folder
cd [DLL Folder, 如E:\GSS\Common Files\NBase20]
gacutil /i [DLL FileName-1]
gacutil /i [DLL FileName-2]
rem See the Result
pause
要安裝時,只要以系統管理者身份執行bat檔就可以了,如下,
不過身為GUI的重度使用者,還是想知道,為何不能用拉的方式,將DLL拉進GAC呢?
於是找到了「Access is denied: ‘xxx.dll’ – Manually add an assembly (.dll) to the GAC on Windows Server 2008 R2」這一篇。
原來是因為在「系統管理工具」->「本機安全性原則」(或是您在直接在command中執行secpol.msc)中「安全性設定」->「本機原則」->「安全性選項」中的「使用者帳戶控制:所有系統管理員均以管理員核准模式執行」(AAM)設定為「啟用」(預設)。
而「以系統管理者身份開啟命令視窗」後再輸入 explorer 來開啟「檔案總管」,這個「檔案總管」並不會吃到「系統管理者的身份」(奇怪,輸入 Notepad 就可以變成系統管理者的身份)。
所以,將「系統管理工具」->「本機安全性原則」中「安全性設定」->「本機原則」->「安全性選項」中的「使用者帳戶控制:所有系統管理員均以管理員核准模式執行」設定為「停用」,然後「重新開機」。
就可以透過「檔案總管」將DLL拉進GAC(C:\Windows\assembly)之中了。當然,在設定完成後,請記得要將設定調整回來哦!
當然,如果以Administrator登入來操作的話,應該是無敵的吧!
如果客戶端無法設定「本機安全性原則」的話,那就使用 gacutil.exe 的方式來安裝到GAC吧!
參考資料
Add an assembly to the Global Assembly Cache on Windows Server 2008 R2
Access is denied: ‘xxx.dll’ – Manually add an assembly (.dll) to the GAC on Windows Server 2008 R2
Difference Between UAC and Admin Approval mode
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^