2012-03-19 153 views
4

我打電話LogonUser嘗試驗證的一組憑據返回true:的LogonUser爲禁用的帳戶

LogonUser("forest", "avatopia.com" "stapler", 
     LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, out token); 

,並返回,即使該帳戶已禁用:

enter image description here


我也嘗試過使用SSPI directly to validate credentials,這 需要調用:

  • AcquireCredentialsHandle(..., "Negotiate", SECPKG_CRED_OUTBOUND, ..., ["forest", "stapler", "avatopia.com"], ...)
  • InitializeSecurityContext(...)
  • AcquireCredentialsHandle(..., "Negotiate", SECPKG_CRED_INBOUND, ...)
  • AcceptSecurityContext(...)
  • InitializeSecurityContext(...)
  • AcceptSecurityContext(...)

在大多數機器上,如果用戶帳戶被禁用,初始呼叫AcquireCredentialsHandle將失敗 。但在這個特定的機器上,我 測試它完成整個週期和工作。


如果我無效密碼嘗試然後LogonUser沒有(正確)失敗

LogonUser("forest", "avatopia.com" "adf342sdf3", 
     LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, out token); 

回報,並GetLastError回報1326(登錄失敗:未知的用戶名或密碼)

試圖SSPI使用無效密碼也(正確)失敗:

  • AcquireCredentialsHandle(..., "Negotiate", SECPKG_CRED_OUTBOUND, ..., ["forest", "adf342sdf3", "avatopia.com"], ...)
  • InitializeSecurityContext(...)
  • AcquireCredentialsHandle(..., "Negotiate", SECPKG_CRED_INBOUND, ...)
  • AcceptSecurityContext(...)失敗8009030C登錄嘗試失敗

什麼是aggrevating是,這種行爲只發生在一臺機器。

爲什麼LogonUser以及整個安全支持提供程序接口指示特定加入域的計算機上禁用帳戶的密碼:有效?

  • 加入域的計算機,其中LogonUser(錯誤地)成功:Windows XP SP2的
  • 加入域的計算機,其中LogonUser(正確)將失敗:Windows XP SP2的

更新:

沒有本地用戶調用Forest

enter image description here

也沒有任何本地用戶名爲Forest

enter image description here

這是無關緊要的,因爲我要求avatopia.com\Forest,而不是speeder\Forest

oi vay僅僅因爲禁用用戶被允許訪問他們本不應該訪問的東西,人們就把他們的內褲放在一堆。

+0

也許有一個同名的本地用戶在域用戶處於活動狀態時被禁用?對我來說,看起來你正在查看本地管理管理單元中的用戶。這是否也顯示禁用的域用戶? – 2012-03-19 14:09:44

+0

@ThorstenDittmar我檢查了;我會添加屏幕截圖到問題。 – 2012-03-19 14:11:54

+1

也許是一個愚蠢的問題,但是當這種情況發生時,你可以從那臺機器到達域控制器嗎?可能正在使用緩存的憑據。 – Luke 2012-03-20 14:25:49

回答

0

如果您改用LOGON32_LOGON_INTERACTIVE會發生什麼?只需瀏覽文檔和NETWORK選項就可以獲得不同類型的標記,以便我可以設想您所看到的行爲。

1

我同意Luke很可能使用緩存的憑據。能夠ping域控制器並不意味着它能夠正確地對話。

您可以嘗試的一個測試是使用該林登錄帳戶登錄該計算機。是的,您可能需要授予他交互式登錄權才能執行此操作,但僅用於故障排除目的。

你可以做的另一件事是證明這是由於證書緩存問題是爲了捕獲域控制器和你的機器之間的網絡流量。查看是否有任何NTLM或Kerberos流量。默認情況下,它應該使用Kerberos與KDC進行通信。如果失敗,它應該使用NTLM與NetLogon服務器通信。

如果證書緩存是真正的問題,我懷疑你可以在AcquireCredentialsHandle的調用中使用「kerberos」而不是「negotiate」來修復它。