我只想查询Credentials Store(或者在Win8中调用的Vault),并获取登录数据。在这种情况下,MSDN真的没有帮助,我也不想要任何C pInvoke方法。
我知道类似的问题在这里已经被问到了几次,但是没有一个解决方案在我的情况下工作。我不使用Metro应用程序编程,所以像PasswordVault这样的东西(看起来)不可用。我只是创建一个简单的C#WPF桌面应用程序。
理想情况下,它应该在几个Windows版本中工作,但Win8是最受欢迎的。
更具体地说,我想从Outlook的CRM插件中查询存储的数据,自动将我的应用程序登录到CRM服务器,而不需要用户要求他的凭据。这意味着,如果这是可能的话
那么如何访问Windows凭据存储?
有一个Nuget库,我一直在使用称为CredentialManagement
http://nuget.org/packages/CredentialManagement/
http://nuget.org/packages/CredentialManagement/
用法非常简单。我把它包好了一点,但可能不需要:
public static class CredentialUtil { public static UserPass GetCredential(string target) { var cm = new Credential {Target = target}; if (!cm.Load()) { return null; } //UserPass is just a class with two string properties for user and pass return new UserPass(cm.Username,cm.Password); } public static bool SetCredentials( string target,string username,string password,PersistanceType persistenceType) { return new Credential {Target = target,Username = username,Password = password,PersistanceType = PersistanceType.Enterprise}.Save(); } public static bool RemoveCredentials(string target) { return new Credential { Target = target }.Delete(); } }
样品用量:
CredentialUtil.SetCredentials("FOO","john","1234",PersistanceType.LocalComputer); var userpass = CredentialUtil.GetCredential("FOO"); Console.WriteLine($"User: {userpass.Username} Password: {userpass.Password}"); CredentialUtil.RemoveCredentials("FOO"); Debug.Assert(CredentialUtil.GetCredential("FOO") == null);
如果您有兴趣自己实现,请浏览源:
http://credentialmanagement.codeplex.com/SourceControl/latest
诀窍是Credential Manager中没有C#API。这个库很好地包装了其他的.dll入口点。