[.NET]要如何透過檔案總管手動將DLL拉進GAC「C:\Windows\assembly」之中?

  • 22730
  • 0
  • .NET
  • 2013-09-14

在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'.」的錯誤,如下圖所示,

image

 

想說會是因為檔案總管不是用系統管理者身份開啟所以沒權限嗎?

所以就以系統管理者身份開啟命令視窗,然後再輸入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檔就可以了,如下,

image

image

 

不過身為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)之中了。當然,在設定完成後,請記得要將設定調整回來哦!

a2

aam

當然,如果以Administrator登入來操作的話,應該是無敵的吧!

如果客戶端無法設定「本機安全性原則」的話,那就使用 gacutil.exe 的方式來安裝到GAC吧!

 

參考資料

Gacutil.exe (全域組件快取工具)

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:從零開始的軟體開發生活

請大家繼續支持 ^_^