2012-11-26 39 views
4

我的應用程序將在客戶端臺式計算機上的LAN上使用。在這個局域網中,有一臺專用的Windows 2k服務器。沒有廣告。根據工作組服務器檢查用戶憑證

用戶必須填寫一個服務器的用戶帳戶信息,因此該應用就可以做一些遠程操作使用此帳戶(映射網絡驅動器)

如何檢查針對此服務器的用戶憑據?

映射驅動程序時,如果用戶帳戶身份驗證不正常,則會出現錯誤,但我想在嘗試映射之前獲取此信息。

類似LogonUser API函數,但在遠程計算機上工作。

感謝,

回答

3

您可以使用WNetUseConnection功能與CONNECT_INTERACTIVECONNECT_PROMPT標誌。與空的用戶ID和密碼參數的組合將調用憑據對話框,當你輸入正確的憑據連接到網絡資源:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    BufferSize: DWORD; 
    ResultFlag: DWORD; 
    NetResource: TNetResource; 
begin 
    NetResource.dwType := RESOURCETYPE_DISK; 
    NetResource.lpLocalName := nil; 
    NetResource.lpRemoteName := '\\MySuperSecret\Place'; 
    NetResource.lpProvider := nil; 
    if WNetUseConnection(Handle, NetResource, nil, nil, CONNECT_INTERACTIVE or 
    CONNECT_PROMPT, nil, BufferSize, ResultFlag) = NO_ERROR 
    then 
    ShowMessage('Connected!'); 
end; 

要連接到的網絡資源不會提示輸入憑據刪除上述規定的標誌它顯示在下面的函數中,當連接成功時返回True,失敗時返回False。下面是參數說明:

  • 遠程名(字符串) - 遠程網絡名稱
  • 用戶名(字符串) - 使用用戶名來連接到網絡資源
  • 密碼(字符串) - 用於連接到一個密碼網絡資源

function TryConnect(const RemoteName, UserName, Password: string): Boolean; 
var 
    BufferSize: DWORD; 
    ResultFlag: DWORD; 
    NetResource: TNetResource; 
begin 
    NetResource.dwType := RESOURCETYPE_DISK; 
    NetResource.lpLocalName := nil; 
    NetResource.lpRemoteName := PChar(RemoteName); 
    NetResource.lpProvider := nil; 
    Result := WNetUseConnection(0, NetResource, PChar(UserName), PChar(Password), 
    0, nil, BufferSize, ResultFlag) = NO_ERROR; 
end; 
+0

謝謝, 我知道這種方式來完成這項工作。 問題是我的應用程序是一種安裝應用程序,開始時會詢問憑據,然後在幾個安裝樣式頁面之後,它會嘗試靜默地將網絡資源與提供的憑據進行映射。我正在尋找一種方法在開始時檢查憑據 – Fred

+0

然後,您可以嘗試刪除這些標誌。第一個,'CONNECT_INTERACTIVE'指定*操作系統可以與用戶進行交互以進行身份​​驗證*,所以現在它應該可以滿足您的需求。 – TLama

+0

感謝您的輸入,我實施了您的解決方案 – Fred

3

我使用單位 SSPIValidatePassword.pas 從http://www.michael-puff.de/Programmierung/Delphi/Units/ 該做的工作適合我。在該單元 SSPLogonUser唯一的導出函數返回true或false ....

+0

謝謝,但我找不出一個辦法讓它工作。我嘗試了其他實現(http://delphi-kb.blogspot.fr/2010/07/logonuser-win-api-call-vs-sspi-call.html),我無法使其與域控制器或工作組服務器 – Fred

+0

+1爲SSPI解決方案! SSPI是在Windows下驗證憑據的首選方式,如Microsoft建議的:http://support.microsoft.com/kb/180548; 也很好的閱讀:http://stackoverflow.com/questions/7111618/win32-how-to-validate-credentials-against-active-directory –

+0

@Fred,SSPI實現是基於Ansi,但在Delphi> = 2009「字符串「類型是unicode - 可能這就是爲什麼代碼不工作? –