2010-06-03 34 views
2

我試圖從作爲LocalSystem帳戶運行的Windows服務連接到受遠程密碼保護的共享文件夾。似乎LocalSystem帳戶無法使用WNetAddConnection2()或類似的調用直接訪問受密碼保護的網絡共享。 任何人都可以證實這一點? 我讀過假冒管理員用戶可能是要走的路。 我試過在WNetAddConnection2()之前使用LogonUser()和ImpersonateLoggedOnUser(),看起來網絡路徑的安裝成功,但實際訪問(例如遠程文件夾中的文件枚舉)失敗。 有什麼建議嗎?Windows服務中的WNetAddConnection2

謝謝。

回答

0

我實際上正在處理同樣的問題,Flavio和我目前的懷疑是,如果有人以交互方式登錄到機器上,它會工作,並且如果沒有人登錄,將返回ERROR_NO_SUCH_LOGON_SESSION。不過,我可能是錯的。更多來。我已經出演了這個問題,並會回來看看:)

+0

到目前爲止,我發現從LocalSystem服務調用WNetAddConnection2()可在Windows 7上工作,但在XP上失敗。 到目前爲止,我總是嘗試與交互式登錄到機器的用戶。如果其他用戶登錄到遠程機器,我認爲這對服務無關緊要,但我可能是錯的。 – Flavio 2010-06-08 09:56:17

2

要告訴我所有的工作時間僅在域環境中,沒有密碼保護的網絡共享的信任,但我知道有建立連接的兩種主要方式:WNetAddConnection2 API和NetUseAdd API。我建議您嘗試NetUseAdd函數,其等級等於1(USE_INFO_1)。我只使用了USE_INFO_2,它有ui2_username,ui2_domainnameui2_password,但USE_INFO_1只有ui1_password,所以它看起來像一個連接到密碼保護共享的功能。

順便說一下,LogonUser()確實沒有意義,因爲它使本地在本地計算機上登錄,並且您需要建立與遠程計算機的會話。這做WNetAddConnection2NetUseAdd函數。

+0

我試圖使用LogonUser(),因爲我已經在MS文檔中讀到LocalSystem帳戶無法建立到遠程計算機的認證連接,所以想法是先模擬一個可以建立連接的用戶(即本地計算機管理員),然後嘗試建立連接。 – Flavio 2010-06-08 09:57:50

+0

只有當您不使用WNetAddConnection2或NetUseAdd並嘗試訪問遠程計算機時,纔會出現問題。如果您使用WNetAddConnection2'或'NetUseAdd',則在目標計算機上進行遠程登錄。如果您在源計算機和目標計算機之間沒有信任,使用LogonUser的本地登錄可能會失敗,因爲您的本地計算機不能識別遠程計算機上的用戶。順便說一下,如果兩臺計算機都在同一個域中,則連接到遠程計算機可以與計算機帳戶一起工作(請參閱http://msdn.microsoft.com/zh-cn/library/ms677973(VS.85).aspx)如果它被授予。 – Oleg 2010-06-08 11:50:15

+0

正如我所說的,WNetAddConnection2()在Windows XP上不出現。它在Windows 7上工作。 這不在域中。 我使用LogonUser()作爲普通用戶登錄到_local_機器,在調用WNetAddConnection2()之前模擬它。 – Flavio 2010-06-08 12:56:12

1

您可以從本地系統帳戶訪問網絡共享的方式(這是「NT AUTHORITY \ SYSTEM」):

  1. 您需要登錄使用具有訪問一些本地帳戶網絡計,即使在非 - 域網。這足以用「NT AUTHORITY \ NETWORK SERVICE」帳戶來此
  2. 添加網絡共享連接與指定它的訪問憑據:

,這裏的要點是LogonUser的過程中使用LOGON32_LOGON_NEW_CREDENTIALS登錄類型()呼叫(請參閱MSDN瞭解詳細信息/限制)。否則,即使LogonUser和模擬成功,您在執行WNetAddConnection2()時也會得到ERROR_NO_SUCH_LOGON_SESSION。


LogonUser("NETWORK SERVICE", "NT AUTHORITY", NULL, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &hToken); 
ImpersonateLoggedOnUser(hToken); 
NETRESOURCE nr; 
nr.dwScope = RESOURCE_GLOBALNET; 
nr.dwType = RESOURCETYPE_DISK; 
nr.dwUsage = RESOURCEUSAGE_CONNECTABLE; 
nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE; 
nr.lpRemoteName = "\\\\SomeCopmuter\\C$"; 
nr.lpLocalName = "Z:"; 
WNetAddConnection2(&nr, "password", "Administrator", 0); 

注意

  • 模擬鑊只對當前線程。
  • 與當地的資源,將工作作爲本地系統中,隨加份額它將作爲用戶工作在WNetAddConenction2指定的遠程計算機上(在這種情況下 - 上SomeComputer管理員)。
  • 您可以省略使用NETRESOURCE和訪問文件的驅動器盤符通過「\服務器\共享\文件名。EXT」符號
  • 這可能不是在某些老的系統工作(NT/2000,不知道確切的名單)
1

我只是遇到了這個問題爲好,並發現,如果我把遠程計算機的名稱(我沒有真正理解這一點,我們在代碼中已經有另一個地方已經這樣做了,所以我知道這是可能的,並且最終找出了區別。)

例如:

WNetAddConnection2(&nr, "password", "SomeComputer\\Username", 0); 

我沒在做任何其他特殊的調用,如LogonUser或ImpersonateLoggedOnUser。

這是在SYSTEM帳戶下運行的服務。

我還沒有嘗試過使用SomeComputer \ Administrator帳戶,但這不完全是一個很好的做法。我在SomeComputer上使用普通用戶帳戶。

0

從win32netcon導入win32wnet導入RESOURCETYPE_DISK作爲DISK路徑=「\ 192.168.1.11 \ Student」win32wnet.WNetAddConnection2(DISK,「R:」,「\ 192.168.1.11 \ Student」,None,「Student」,「pass 「,0)