1. 程式人生 > >解析程序為何不能訪問網路資源

解析程序為何不能訪問網路資源

昨天被windows服務不能訪問網路資源搞得焦頭爛額,我的執行環境如下:

用C#寫的Windows服務使用localSystem執行,電腦本身不在域中(電腦如果是用域賬號登入就沒有這個問題了),但使用windows憑據登入域並訪問其中一個共享網盤。登入系統使用的賬號是Administrator。該服務操作本機的各種資源都是沒有問題的,但訪問網盤不管是以IP直接訪問還是使用Administrator已經對映的網盤都是無許可權的。使用該服務呼叫Net Use來建立網路連線也不行。

網上找了半天,找到一篇[email protected]email.com.cn轉載的文章:http://blog.itpub.net/10752043/viewspace-961042/

講的相對通俗易懂,特拿來收藏。

通讀之後,我覺得一種解決辦法是使用user安裝,然後將服務的登入賬號改為本機當前使用的帳戶(Administrator)並輸入密碼,找到這篇文章前我就是這麼做的[已實現],只是部署時比較費時。

另一種辦法是以localSystem安裝執行,但允許服務與桌面互動[待驗證]。--簡單測試了一下,還是不行啊

原文如下:

前言

  system許可權的程序使.NET use訪問網路共享時產生“系統發生 1312 錯誤,指定的登入會話不存在,可能已被終止。”,本文試圖對此進行一下解釋。再有就是使用IIS建立的程序通常也不能使用網路資源,產生的錯誤是一樣的,原因也在這篇文章裡闡述了。

本地系統賬號

  當使用者登入系統時,windows NT/2000 將驗證他的密碼,如果使用者驗證成功,系統產生一個訪問令牌,它包含使用者安全標示符(SID)、組SID列表、特權列表和模擬(Impersonating)資訊等安全資訊。該使用者啟動的任何程序都將附加該令牌,訪問令牌代表程序的安全環境,它控制了程序與可保護物件(securable object)的互動。當程序訪問一個可保護物件時,系統將該物件的訪問控制列表(ACL)中的每個訪問控制項(ACE)和訪問令牌中的 SID 進行比較以確定程序是否可以訪問該物件。由於使用者啟動的任何程序都將附加該使用者的訪問令牌,因此任何程序都知道使用者的 SID 並且可以訪問它。

  Local System 賬號是內建的系統賬號,所有系統程序都在 Local System 的安全環境中執行,Local System 賬號是用於啟動服務的預設賬號,它繼承了服務控制管理器的安全環境,在本地計算機上擁有幾乎無限的許可權。在 Local System 賬號環境執行的程序沒有與任何已登入的使用者賬號相聯絡,沒有用於驗證的信任憑證(使用者名稱、域和密碼),而該信任憑證(credential)用於網路上其他計算機的驗證,這樣以 Local System 賬號執行的程序就不能訪問網路資源,如網路共享。

  在 Local System 賬號環境執行的程序和普通程序的不同之處在於:

1) 登錄檔的 HKEY_CURRENT_USER 鍵是和預設使用者而不是當前使用者相聯絡的,要訪問其他使用者的配置檔案,需要先模擬該使用者,然後再訪問 HKEY_CURRENT_USER 。

2) 可以開啟 HKEY_LOCAL_MACHINESECURITY 登錄檔鍵

3) 該程序不能訪問網路資源,如共享、管道,因為它不能提供信任憑證,而只能使用空連線。 在 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesLanmanServerParameters 處的 NullSessionPipes 和 NullSessionShares 的值指明瞭可以被空連線訪問的管道和共享。

或者也可以設定 RestrictNullSessAccess = 0,以允許空連線的使用者訪問該計算機上的所有管道和共享。(呵呵,這個是個安全隱患呦,可不要幹呀。上邊兩個值最好也全都設成空)

4) 不能和其他程式共享物件,除非在建立物件時設定 DACL 允許使用者訪問。

5) 如果啟動命令列提示符來執行批處理檔案,使用者可以按 Ctrl+C 來終止批處理的執行,並且使用者就獲得了一個 Local System 許可權的 shell

IIS服務的模擬

  正是由於服務程式執行在許可權極大的 Local System 賬號下,如果網路客戶也使用該賬號來訪問系統將給系統帶來安全隱患,因此 NT/2000 提供了模擬功能 --- 服務程式在處理客戶請求時使用一個許可權較低的客戶身份執行,處理完客戶請求再恢復。IIS就是使用這個原理,雖然配置 iis 以 Local System 賬號執行,而一般的匿名請求就是以 IUSR_computer 身份(guests 組)和 IWAM_computer 身份(guests 組)執行的。模擬又分兩種,在程序裡使用模擬令牌來模擬某個使用者(模擬令牌裡的使用者)和使用主要令牌來建立新的程序。在程序內的某個執行緒可以使用 ImpersonateLoggedOnUser(同時需要提供一個代表某個登入使用者的模擬令牌)模擬使用者時,這個執行緒就是該模擬令牌代表的使用者的身份,處理完成後使用 RevertToSelf 恢復自己的身份。建立新的程序使用 CreateProcesSASUser(比 CreateProcess 函式多一個主要令牌的引數),這樣啟動的新程序就不是父程序的身份,而是主要令牌代表的登入使用者。對於ASP、asa等ISapi擴充套件,是動態連線庫的形式,是程序內的模擬;而CGI程式(cmd.exe,ncx99.exe)則是使用的建立新程序方式進行的模擬。

  不過即使我們通過IIS啟動了程序,一般仍然不能使用網路資源,就是不能使用 net use,如果使用將產生“系統發生 1312 錯誤。指定的登入會話不存在。可能已被終止。”的錯誤,這是因為不同的登入型別造成的。windows NT支援以下5種登入型別:

登入型別含義 LOGON32_LOGON_INTERACTIVE  互動登入:這個是通常的本地登入或者終端服務、telnet等 LOGON32_LOGON_SERVICE  服務登入:作為服務登入系統 LOGON32_LOGON_NETWORK  網路登入:用於高效能的服務來驗證明文密碼 LOGON32_LOGON_BATCH 批處理登入:用於批處理伺服器或者同時處理多個明文驗證的高效能伺服器 LOGON32_LOGON_UNLOCK  解除鎖定登入:設計用來為 GINA DLL 記錄互動登入使用者解除工作站鎖定的。這種型別允許在工作站解除鎖定時產生一條稽核記錄

除了以上5種登入型別外,Windows 2000 還支援以下兩種型別LOGON32_LOGON_NETWORK_CLEARTEXT,LOGON32_LOGON_NEW_CREDENTIALS(詳細詳細參見 msdn 裡關於 LogonUser 函式的解釋)。

根據 IIS 驗證方式的不同,IIS支援不同的登入型別。IIS 4支援以下5種類型的驗證方式:

驗證型別

模擬型別 匿名登入(沒有驗證),允許密碼自動同步(預設) Network - 網路 匿名登入(沒有驗證),禁止密碼自動同步 IIS Clear Text - IIS明文 基本驗證 IIS Clear Text - IIS明文 整合NT驗證,NTLM Network - 網路 客戶端使用 SSL Certificate Mapping Interactive - 互動

  可否訪問網路資源由模擬的登入令牌型別決定,網路登入令牌是不能訪問網路資源的,因為這種型別的訪問令牌是在通過網路完成驗證後由伺服器建立的,伺服器使用這種令牌來訪問網路上的其他計算機是一個安全隱患。

互動登入就和本地登入一樣,是可以訪問網路資源的。

IIS 支援的第三種類型的訪問令牌是批處理令牌,它是設計用來在安全的環境裡進行批處理工作的,批處理令牌也可以訪問網路資源。

IIS 明文驗證的概念來自於IIS是以明文的方式獲得使用者名稱和密碼的事實。管理員可以控制明文登入建立互動令牌、批處理令牌還是網路令牌,這由 metabase的 LogonMethod 屬性決定。預設這種登入建立互動令牌。

  一般管理員在配置 IIS 時會允許密碼自動同步(這樣就不用關心 IUSR_computer 使用者的密碼的更改),還有就是整合 NT 的 NTLM 驗證也是比較常見的,不過這兩者驗證都將建立網路訪問令牌,因此我們就不能訪問網路資源了。

參考文獻:

source/Access%20Tokens.html">Access Tokens Client's Security ContextLocalSystem AccountImpersonating Clientsq207671-Accessing Network Files from IIS ApplicationsImpersonateLoggedOnUserCreateProcessAsUserRevertToSelfLogonUser   以上所有資料均來自MSDN

注:關於MSDN資料裡系統賬號特殊之處這段:

  • The registry key HKEY_CURRENT_USER is associated with the default user, not the current user. To access another user's profile, impersonate the user, then access HKEY_CURRENT_USER.

本來2000/5的資料是這樣的:

  • The service cannot open the registry key HKEY_CURRENT_USER.

後來獲得最新資料,微軟的說法有變,意思自然也不同了。