La respuesta aceptada resuelve el problema, pero tiene el efecto secundario de dejar las credenciales de los usuarios almacén de credenciales. Terminé creando un IDisposable para poder usar las credenciales en una declaración de uso.
using (new RDPCredentials(Host, UserPrincipalName, Password))
{
/*Do the RDP work here*/
}
internal class RDPCredentials : IDisposable
{
private string Host { get; }
public RDPCredentials(string Host, string UserName, string Password)
{
var cmdkey = new Process
{
StartInfo =
{
FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"),
Arguments = [email protected]"/list",
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = false,
RedirectStandardOutput = true
}
};
cmdkey.Start();
cmdkey.WaitForExit();
if (!cmdkey.StandardOutput.ReadToEnd().Contains([email protected]"TERMSRV/{Host}"))
{
this.Host = Host;
cmdkey = new Process
{
StartInfo =
{
FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"),
Arguments = [email protected]"/generic:TERMSRV/{Host} /user:{UserName} /pass:{Password}",
WindowStyle = ProcessWindowStyle.Hidden
}
};
cmdkey.Start();
}
}
public void Dispose()
{
if (Host != null)
{
var cmdkey = new Process
{
StartInfo =
{
FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\cmdkey.exe"),
Arguments = [email protected]"/delete:TERMSRV/{Host}",
WindowStyle = ProcessWindowStyle.Hidden
}
};
cmdkey.Start();
}
}
}
¿Puedo usar PowerShell con C#? Lo siento, soy nuevo. – Krzysiek
Básicamente, la idea es ejecutar CMDKEY.EXE para crear sus credenciales temporales en el depósito de credenciales almacenado, y luego ejecutar MSTSC.EXE. MSTSC debe encontrar las credenciales y usarlas. Puede ejecutar estos programas desde C# usando 'Process.Start'; no necesitas Powershell. –
¡Funcionó como un encanto! ¡Muchas gracias! – Krzysiek