c# - para - Ejecute mstsc.exe con el nombre de usuario y la contraseña especificados
comando para escritorio remoto como administrador (6)
Esta es una versión actualizada de la publicación de Krzysiek.
var rdcProcess = new Process
{
StartInfo =
{
FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%/system32/cmdkey.exe"),
Arguments = String.Format(@"/generic:TERMSRV/{0} /user:{1} /pass:{2}",
fp.ipAddress,
(String.IsNullOrEmpty(fp.accountDomain)) ? fp.accountUserName : fp.accountDomain + "//" + fp.accountUserName,
fp.accountPassword),
WindowStyle = ProcessWindowStyle.Hidden
}
};
rdcProcess.Start();
rdcProcess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%/system32/mstsc.exe");
rdcProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
rdcProcess.StartInfo.Arguments = String.Format("/f /v {0}", fp.ipAddress); // ip or name of computer to connect
rdcProcess.Start();
Me doy cuenta de que en Windows 7, no es posible guardar diferentes credenciales para el mismo host, pero necesito algunas soluciones.
¿Puedo proporcionar el nombre de usuario y la contraseña manualmente en el código? ¿Almacenarlos en un archivo temp .rdp?
La respuesta aceptada resuelve el problema, pero tiene el efecto secundario de dejar las credenciales en el almacén de credenciales de los usuarios. 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 = $@"/list",
WindowStyle = ProcessWindowStyle.Hidden,
UseShellExecute = false,
RedirectStandardOutput = true
}
};
cmdkey.Start();
cmdkey.WaitForExit();
if (!cmdkey.StandardOutput.ReadToEnd().Contains($@"TERMSRV/{Host}"))
{
this.Host = Host;
cmdkey = new Process
{
StartInfo =
{
FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%/system32/cmdkey.exe"),
Arguments = $@"/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 = $@"/delete:TERMSRV/{Host}",
WindowStyle = ProcessWindowStyle.Hidden
}
};
cmdkey.Start();
}
}
}
Mientras intentaba descubrir cómo permitir que los usuarios ingresaran a nuestra red, sin darles las claves del castillo, habilité el acceso a escritorio remoto para algunos miembros de mi equipo. Pensando más en esto, rápidamente recordé un proyecto hace varios años mientras trabajaba para el Departamento de Defensa. Ese proyecto nos obligó a "bloquear" el acceso solo al personal necesario y el acceso limitado a los programas en los servidores. Después de dedicar algo de tiempo a la KnowledgeBase de Microsoft, nos dimos cuenta de que podíamos crear "accesos directos" de escritorio para aquellos empleados que realizaron la conexión RDP, los registraron y limitaron su acceso a una aplicación específica en ese servidor.
Si desea usar powershell, puede agregar las credenciales usando
cmdkey /generic:DOMAIN/"computername or IP" /user:"username" /pass:"password"
Entonces llame a la conexión RDP usando
Start-Process -FilePath "$env:windir/system32/mstsc.exe" -ArgumentList "/v:computer name/IP" -Wait
Si desea eliminar las credenciales ejecutadas
cmdkey /delete:DOMAIN/"Computer name or IP"
Recuerde eliminar ""
@echo off
cmdkey /generic:TERMSRV/"*IP or Server Name*" /user:%username%
start mstsc /v:*IP or Server Name*
cmdkey /delete:TERMSRV/"*IP or Server Name*"
quit
Process rdcProcess = new Process();
rdcProcess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%/system32/cmdkey.exe");
rdcProcess.StartInfo.Arguments = "/generic:TERMSRV/192.168.0.217 /user:" + "username" + " /pass:" + "password";
rdcProcess.Start();
rdcProcess.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%/system32/mstsc.exe");
rdcProcess.StartInfo.Arguments = "/v " + "192.168.0.217"; // ip or name of computer to connect
rdcProcess.Start();
El código anterior inicia una conexión con .217 y no se me solicita que proporcione una contraseña. Gracias por la ayuda.