2008-09-22 321 views

回答

28

密碼:不,這是因爲安全原因而不被保留 - 它被使用,然後被丟棄。您可以從註冊表中爲該用戶檢索加密的密碼,並給予足夠的權限,然後使用類似rainbow tables的密碼對其進行解密,但使用當前方法這非常耗費資源和耗時。更好地提示用戶。或者,如果您想要像Novell那樣實施某種'單點登錄'系統,您應該通過GINA(Vista之前)或Credential Provider(Vista)來完成,這將導致您的代碼在登錄時被授予用戶名和密碼,只有密碼可用。

對於用戶名,獲取當前用戶名(運行代碼的用戶)很容易:AdvApi32.dll中的GetUserName函數完全適合您。

如果您作爲一項服務運行,您需要記住沒有一個「登錄用戶」:除了任何實際的任何時間,任何時候都有幾個如LocalSystem,NetworkService,SYSTEM和其他帳戶人。 This article provides some sample code and documentation這樣做。

+0

謝謝 - 我不想破解密碼,我只想保存用戶一步,但由於沒有「好」的方法來做到這一點,我只是提示用戶。 – dennisV 2008-09-22 07:34:13

3

如果可能的話,我會認爲它是一個巨大的安全缺陷!

+1

是的,這就是我的想法,但要仔細檢查我沒有遺漏任何東西...... – dennisV 2008-09-22 07:21:56

2

GetUserName會爲您提供名稱,但您無法獲得密碼。這甚至不是Windows存儲的東西,AFAIK - 只是你的密碼散列。

根據你想要達到什麼(你可以告訴我們更多..)可以模仿登錄用戶並代表他/她做些什麼。

+0

謝謝 - 這就是我的想法。 – dennisV 2008-09-22 07:22:35

4

由於加密後的用戶密碼無法獲取(更不用說它不是以明文形式存儲密碼的標準做法)。

用於獲取用戶名,您可以使用GetUserNameNPGetUser

0

你可以用GetUserName()的用戶名,但你不能得到密碼;這將違反假人101的安全性。

+0

謝謝 - 將不得不提醒用戶我猜。 – dennisV 2008-09-22 07:24:42

0

重新「網絡密碼恢復」工具
的Windows(截至XP)存儲在passwd的一個簡單方便的拷貝,打破加密 - 用於連接到舊式lanmanager網絡共享。 這些工具通常會嘗試使用所有可能的密碼,使用彩虹表(預先加密的字典詞語加密版本)加快速度。

在XPsp2/3 Vista中,此功能已刪除。新的加密技術很難破解,需要花費很長時間來嘗試所有可能的值,還有一些在線服務可以在大量機器上運行,以便爲您提供價格的快速回答。

要回答原始海報 - 通常不會存儲密碼並將其與用戶輸入的內容進行比較。您對輸入的密碼進行加密(實際上是散列)並將其存儲。要檢查密碼,您可以對用戶執行的任何操作執行相同的加密,然後進行比較。通常不可能從加密表單返回到真實密碼。

編輯我懷疑你在問這裏的錯誤問題 - 你爲什麼要密碼,你想要驗證什麼,以及什麼時候?

+0

是的,我明白了。提示用戶比較「不尋常」更安全,因爲我沒有看到太多的應用程序這樣做。 – dennisV 2008-09-22 23:20:39

2

對於許多評論誰相信這是不可能揭示當前登錄用戶的密碼,請參閱Dump cleartext passwords of logged in user(s)它展示瞭如何使用mimikatz做到這一點:

mimikatz # privilege::debug 
Demande d'ACTIVATION du privilège : SeDebugPrivilege : OK 

mimikatz # sekurlsa::logonPasswords full 
... 
Utilisateur principal  : user 
Domaine d'authentification : domain 
     kerberos : 
     * Utilisateur : user 
     * Domaine  : domain 
     * Mot de passe : pass 
1

我不瞭解Windows登錄密碼......但您絕對可以從憑證管理器中提取純文本密碼。例如,這裏有一個程序來提取TFS的密碼。在大多數情況下,這與Windows登錄相同。

namespace ShowPassword 
{ 
    using Microsoft.TeamFoundation.Client; 
    using System; 
    using System.Net; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var tpc = new TfsTeamProjectCollection(new Uri("http://mycompany.com/tfs")); 
      var nc = tpc.Credentials as NetworkCredential; 
      Console.WriteLine("the password is " + nc.Password); 
     } 
    } 
} 

我在vs 2015中用Nuget包TeamFoundation ExtendedClient編譯爲「console」應用程序。