2012-07-02 25 views
26

Me doy cuenta de que en Windows 7 no es posible guardar credenciales diferentes para el mismo host, pero necesito algunas soluciones.Ejecute mstsc.exe con el nombre de usuario y la contraseña especificados

¿Puedo proporcionar el nombre de usuario y la contraseña manualmente en el código? ¿Almacenarlos en un archivo temp.rdp?

+0

¿Puedo usar PowerShell con C#? Lo siento, soy nuevo. – Krzysiek

+5

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. –

+0

¡Funcionó como un encanto! ¡Muchas gracias! – Krzysiek

Respuesta

36
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 pide que proporcione una contraseña. Gracias por ayuda.

+2

Si no desea mantener las credenciales almacenadas en el repositorio, después de este código, puede volver a llamar a 'cmdkey.exe' con los argumentos'/delete: TERMSRV/192.168.0.217' – chopikadze

+1

Se me sigue solicitando la contraseña. Mi máquina está usando vista business – Parth

+0

Aún me piden una contraseña. Mi máquina está usando Windows 8. –

1

Al intentar descubrir cómo permitir el acceso de los usuarios a nuestra red, sin darles las llaves del castillo, habilité el acceso a Escritorio remoto para algunos miembros de mi equipo. Pensando más en esto, recordé rápidamente un proyecto hace varios años mientras trabajaba para el Departamento de Defensa. Ese proyecto requirió que "bloqueáramos" el acceso solo al personal necesario y el acceso limitado a los programas en los servidores. Después de pasar algún tiempo en KnowledgeBase de Microsoft, nos dimos cuenta de que podíamos crear "accesos directos" de escritorio para aquellos empleados que realizaban la conexión RDP, los iniciaban y limitaban el acceso a una aplicación específica en ese servidor.

+1

Así es como Snowden obtuvo la información :) (J/K) – Zuzlx

36

Si desea utilizar PowerShell podría agregar las credenciales usando

cmdkey /generic:DOMAIN/"computername or IP" /user:"username" /pass:"password" 

A continuación, llame conexión RDP utilizando

Start-Process -FilePath "$env:windir\system32\mstsc.exe" -ArgumentList "/v:computer name/IP" -Wait 

Si desea eliminar las credenciales corren

cmdkey /delete:DOMAIN/"Computer name or IP" 

Recuerde eliminar ""

+0

¡Me gusta! Lo tengo para trabajar en Windows Server 2008 R2. – Alain

+0

Consulte http://stackoverflow.com/a/29984647/393367 para obtener información sobre cómo deshabilitar la advertencia de certificado. – lvmeijer

+0

¿podemos hacer esto solo con un lote (dos líneas de comando)? – LongTTH

9

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(); 
+0

Casi funcionó, pero aún necesito ingresar la contraseña –

+1

@MarekBar Su dominio puede tener un GPO que prohíbe el almacenamiento de contraseñas para las conexiones a Escritorio remoto. – Craig

1
@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 
+3

Si bien este fragmento de código puede ser la solución, [incluyendo una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely-cob-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. – Adam

0

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(); 
     } 
    } 
} 
Cuestiones relacionadas