C#学习教程:使用C#从Windows凭证存储中检索凭证MSDN在这种情况下真的没用,我不想要任何C++pInvoke方法。我知道这里曾多次问过类似的问题,但没有一种解决方案适合我的情况。我不使用MetroApp编程,所以像PasswordVault这样的东西(看起来不可用)。我只是在创建一个简单的C#WPF桌面应用程序。理想情况下,它应该适用于多个Windows版本,但首选Win8。更具体地说,我想从CRM插件查询存储的数据,以便自动让我的应用程序登录到CRM服务器,而无需用户询问他的凭据。这意味着,如果可能的话……我如何访问Windows凭据存储?我一直在使用一个名为CredentialManagement的Nuget库http://nuget.org/packages/CredentialManagement/使用非常简单。我把它打包了一点,但可能不需要:publicstaticclassCredentialUtil{publicstaticUserPassGetCredential(stringtarget){varcm=newCredential{Target=target};如果(!cm.Load()){返回null;}//UserPass只是一个有两个字符串属性的类,用于user和passreturnnewUserPass(cm.Username,cm.Password);}publicstaticboolSetCredentials(stringtarget,stringusername,stringpassword,PersistanceTypepersistenceType){returnnewCredential{Target=target,Username=username,Password=password,PersistanceType=persistenceType}.Save();}publicstaticboolRemoveCredentials(stringtarget){returnnewCredential{Target=target}.Delete();}}产品使用方法:CredentialUtil.SetCredentials("FOO","john","1234",PersistanceType.LocalComputer);varuserpass=CredentialUtil.GetCredential("FOO");Console.WriteLine($"用户:{userpass.Username}密码:{userpass.Password}");CredentialUtil.RemoveCredentials("FOO");调试断言(CredentialUtil.GetCredential("FOO")==null);如果您有兴趣自己实现它,请浏览源代码:http://credentialmanagement.codeplex.com/SourceControl/latest诀窍是CredentialManager中没有C#API这个库很好适当地包装其他.dll入口点.?这适用于Windows2k12,我没有Win8框来测试http://blogs.msdn.com/b/cdndevs/archive/2013/10/02/using-windows-8-winrt-apis-in-net-desktop-applications.aspx简而言之卸载项目文件编辑它8.0添加到PropertyGroup部分添加对Windows.Security的引用(您将有一个Windows库列表)添加位于C:\ProgramFiles(x86)ReferenceAssembliesMicrosoft框架。来自NETCorev4.5的System.Runtime.WindowsRuntime.dll然后你可以使用它(从这里):privatestringresourceName="MyApp";私有字符串默认用户名;privatevoidLogin(){varloginCredential=GetCredentialFromLocker();if(loginCredential!=null){//储物柜中存储了一个凭证。//填充凭据的密码属性//以实现自动登录。登录凭证。找回密码();}else{//储物柜中没有存储凭证。//显示UI以获取用户凭据。loginCredential=GetLoginCredentialUI();}//登录用户。ServerLogin(loginCredential.UserName,loginCredential.Password);}私有Windows.Security.Credentials.PasswordCredentialGetCredentialFromLocker(){Windows.Security.Credentials.PasswordCredential凭证=null;varvault=newWindows.Security.Credentials.PasswordVault();varcredentialList=vault.FindAllByResource(resourceName);如果(credentialList.Count>0){如果(credentialList.Count==1){credential=credentialList[0];}else{//当有多个用户名时,//检索默认用户名。如果不存在,则显示UI以让用户选择//??默认用户名。defaultUserName=GetDefaultUserNameUI();credential=vault.Retrieve(resourceName,defaultUserName);}}返回凭证;Randy的答案使用System.String来存储密码,这是不安全的你需要使用System.Security.SecureString来实现这一点。如果您只是阅读CredentialManagementUsing.NETFramework2.0会更好。使用CredentialManagement(参见答案https://stackoverflow.com/a/17747020/206730)。使用Powershell可能有效:CredMan.ps1https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Credentials-d44c3cde我无法列出所有存储的凭据。以上就是C#学习教程:使用C#从Windows凭据库中获取凭据共享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——usingCredentialManagement;使用系统诊断;namespaceUnitTestProject1{[TestClass]publicclassCredentialTests{[TestMethod]publicvoidSet_Credentials_for_older_domain_whe_migration_to_new_domain(){varaccesos=newList{“intranet”,“intranet.xxxxx.net”,“intranet.zzzzzzzzzzzztrazzz.com”,“tornet”,“更多的...”,};accesos.ForEach(acceso=>SaveCredential(acceso));}privatestaticCredentialSaveCredential(stringCredentialName){varUserName=@"OLDERDOMAINuser";变种密码=“通过”;varcm=newCredential{Target=CredentialName,Type=CredentialType.DomainPassword};如果(cm.Exists()){cm.Load();Console.WriteLine("Credential"+cm.Target+".Data:"+cm.Username+""+cm.Password);//if(cm.Type==CredentialType.Generic)cm.Delete();返回厘米;}cm=newCredential{Target=CredentialName,Type=CredentialType.DomainPassword,PersistanceType=PersistanceType.Enterprise,Username=UserName,Password=Password};cm.保存();返回厘米;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。转载请注明出处:
