2013-01-09 241 views
2

我在Windows 2003 Server上需要訪問webdav資源作爲UNC路徑的服務。此服務的目的是驗證(並採取糾正措施)webdav功能,以共享點。這個想法是寫一個文件到共享點,並驗證它的內容。如果出現問題並且超出閾值,則mrxdav和webclient服務將重新啓動。從服務訪問WebDav資源時訪問被拒絕

我在2003服務器上的本地管理員的服務帳戶下運行該服務,並且可以訪問sharepoint「文件夾」。 (我通過使用服務帳戶登錄並將文件寫入同一文件夾進行驗證)。

當服務嘗試將文件寫入到這個文件夾失敗並訪問被拒絕,過程監控顯示,該服務在LocalSystem下運行,並冒充我的服務帳戶

enter image description here enter image description here enter image description here

我也嘗試使用LogonUser和LogonUserEx(具有登錄交互式,網絡,網絡明文和提供程序的各種選項)模仿我的代碼中的服務帳戶,然後使用ImpersonateUser,但都導致相同的ACCESS DENIED。

我認爲這是特定於使用WebClient服務的服務的內容。 我的代碼是用Delphi編寫的,但我也添加了c標籤以吸引更多的讀者,因爲我不認爲我的問題是Delphi相關的。

編輯:也許相關,我正在運行一個單獨的線程,實際上訪問WebDav共享。

編輯:作爲一種變通方法,我創建使用顯式憑據使用下面的代碼的網絡連接:

function TGuardThread.Map(const Username: String; var Password: String; 
    const Domain: String): Boolean; 
var 
    nr: NETRESOURCE; 
    dwRes: DWORD; 
begin 
    try 
    ZeroMemory(@nr, SizeOf(nr)); 
    nr.dwType := RESOURCETYPE_ANY; 
    nr.lpRemoteName := PChar('\\mywebdavroot\myfolder'); 

    dwRes := WNetAddConnection2(nr, PChar(Password), 
     PChar(Format('%s\%s', [Domain, Username])), CONNECT_UPDATE_PROFILE); 

    Result := dwRes = NO_ERROR; 
    finally 
    if Length(Password) > 0 then 
     SecureZeroMemory(@Password[1], Length(Password) * SizeOf(Char)); 
    end; 
end; 
+1

是不是Windows本地系統通過設計剝離的任何網絡訪問? –

+0

@ Arioch'All LocalSystem是(系統不是)但這就是爲什麼我使用服務(用戶)帳戶運行服務。 – Remko

回答

0

解決辦法是使用具有憑證到WebDAV服務器顯式連接,像這樣:

function TGuardThread.Map(const Username: String; var Password: String; 
    const Domain: String): Boolean; 
var 
    nr: NETRESOURCE; 
    dwRes: DWORD; 
begin 
    try 
    ZeroMemory(@nr, SizeOf(nr)); 
    nr.dwType := RESOURCETYPE_ANY; 
    nr.lpRemoteName := PChar('\\mywebdavroot\myfolder'); 

    dwRes := WNetAddConnection2(nr, PChar(Password), 
     PChar(Format('%s\%s', [Domain, Username])), CONNECT_UPDATE_PROFILE); 

    Result := dwRes = NO_ERROR; 
    finally 
    if Length(Password) > 0 then 
     SecureZeroMemory(@Password[1], Length(Password) * SizeOf(Char)); 
    end; 
end;