c# - sistema - ver contraseña credenciales de red windows 7
Recupere las credenciales del almacén de credenciales de Windows usando C# (4)
Esto funciona desde Windows 2k12, no tengo un cuadro de Win 8 para probar
En breve
- Descargar archivo de proyecto
- Editarlo
- Agregue <TargetPlatformVersion> 8.0 </TargetPlatformVersion> a la parte PropertyGroup
- Agregue una referencia a Windows.Security (tendrá una lista de bibliotecas de Windows)
- Agregue System.Runtime.WindowsRuntime.dll ubicado en C: / Archivos de programa (x86) / Referencias de referencia / Microsoft / Framework.NETCore / v4.5
Puedes usar esto (desde here ):
private string resourceName = "My App";
private string defaultUserName;
private void Login()
{
var loginCredential = GetCredentialFromLocker();
if (loginCredential != null)
{
// There is a credential stored in the locker.
// Populate the Password property of the credential
// for automatic login.
loginCredential.RetrievePassword();
}
else
{
// There is no credential stored in the locker.
// Display UI to get user credentials.
loginCredential = GetLoginCredentialUI();
}
// Log the user in.
ServerLogin(loginCredential.UserName, loginCredential.Password);
}
private Windows.Security.Credentials.PasswordCredential GetCredentialFromLocker()
{
Windows.Security.Credentials.PasswordCredential credential = null;
var vault = new Windows.Security.Credentials.PasswordVault();
var credentialList = vault.FindAllByResource(resourceName);
if (credentialList.Count > 0)
{
if (credentialList.Count == 1)
{
credential = credentialList[0];
}
else
{
// When there are multiple usernames,
// retrieve the default username. If one doesn’t
// exist, then display UI to have the user select
// a default username.
defaultUserName = GetDefaultUserNameUI();
credential = vault.Retrieve(resourceName, defaultUserName);
}
}
return credential;
}
Simplemente quiero consultar el Credentials Store (o Vault como se llama en Win8) y obtener los datos de inicio de sesión. La MSDN es realmente inútil en este caso y tampoco quiero ningún enfoque de C ++ pInvoke.
Sé que algunas preguntas similares se han formulado aquí varias veces, pero ninguna de esas soluciones funciona en mi caso. No uso la programación de la aplicación Metro, por lo que las cosas como PasswordVault
(como parece) no están disponibles. Acabo de crear una aplicación de escritorio C # WPF simple.
Idealmente, debería funcionar en varias versiones de Windows, pero se prefiere Win8.
Más específicamente, quiero consultar los datos almacenados del complemento de CRM para que Outlook haga que mi aplicación inicie sesión automáticamente en el servidor de CRM sin que el usuario le solicite sus credenciales. Eso significa, si esto es posible ...
Entonces, ¿cómo accedo a la Tienda de credenciales de Windows?
Hay una biblioteca de Nuget que he estado usando llamada CredentialManagement http://nuget.org/packages/CredentialManagement/
El uso es bastante simple. Lo envolví un poco pero probablemente no necesité:
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 = persistenceType}.Save();
}
public static bool RemoveCredentials(string target)
{
return new Credential { Target = target }.Delete();
}
}
Uso de la muestra:
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);
Si está interesado en implementarlo usted mismo, examine la fuente: http://credentialmanagement.codeplex.com/SourceControl/latest
El truco es que no hay una API de C # en el Administrador de credenciales. Esta biblioteca envuelve los otros puntos de entrada .dll muy bien. :-)
La respuesta de Randy usa System.String
para almacenar la contraseña, lo cual no es seguro. Usted querrá usar System.Security.SecureString
para ese propósito.
Estaría mejor si leyera la Administración de credenciales con .NET Framework 2.0 .
Usando CredentialManagement (ver respuesta https://.com/a/17747020/206730 ).
Tal vez sea útil usar Powershell también:
CredMan.ps1
https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Credentials-d44c3cde
No puedo enumerar todas las credenciales almacenadas.
using CredentialManagement;
using System.Diagnostics;
namespace UnitTestProject1
{
[TestClass]
public class CredentialTests
{
[TestMethod]
public void Set_Credentials_for_older_domain_whe_migration_to_new_domain()
{
var accesos = new List<string> {
"intranet",
"intranet.xxxxx.net",
"intranet.zzzzzzzz.com",
"intranetescritorio.zzzzzzzz.net",
"more...",
};
accesos.ForEach(acceso => SaveCredential(acceso));
}
private static Credential SaveCredential(string CredentialName)
{
var UserName = @"OLDERDOMAIN/user";
var Password = "pass";
var cm = new Credential { Target = CredentialName, Type = CredentialType.DomainPassword };
if (cm.Exists())
{
cm.Load();
Console.WriteLine("Credential " + cm.Target + ". Data: " + cm.Username + " " + cm.Password);
//if (cm.Type == CredentialType.Generic) cm.Delete();
return cm;
}
cm = new Credential
{
Target = CredentialName,
Type = CredentialType.DomainPassword,
PersistanceType = PersistanceType.Enterprise,
Username = UserName,
Password = Password
};
cm.Save();
return cm;
}
}