2012-07-02 18 views
26

Zdaję sobie sprawę, że w systemie Windows 7 nie można zapisać różnych poświadczeń dla tego samego hosta, ale potrzebuję obejścia.Uruchom plik mstsc.exe z podaną nazwą użytkownika i hasłem.

Czy mogę podać nazwę użytkownika i hasło ręcznie w kodzie? Przechowuj je w pliku temprdrdp?

+0

mogę używać PowerShell z C#? Przepraszam, jestem nowy. – Krzysiek

+5

Zasadniczo chodzi o wykonanie polecenia CMDKEY.EXE w celu utworzenia tymczasowych poświadczeń w przechowywanym repozytorium poświadczeń, a następnie wykonanie MSTSC.EXE. MSTSC powinien znaleźć dane uwierzytelniające i je wykorzystać. Możesz uruchomić te programy z poziomu C# za pomocą 'Process.Start'; nie potrzebujesz Powershell. –

+0

Pracował jak urok !!! Wielkie dzięki! – Krzysiek

Odpowiedz

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

Powyższy kod inicjuje połączenie z .217 i nie jest wyświetlany monit o podanie hasła. Dzięki za pomoc.

+2

Jeśli nie chcesz przechowywać zapisanych poświadczeń w repozytorium, po tym kodzie możesz ponownie wywołać 'cmdkey.exe' z argumentami'/delete: TERMSRV/192.168.0.217' – chopikadze

+1

Ciągle pojawia się monit o podanie hasła. Moja maszyna korzysta z usługi vista – Parth

+0

Ciągle otrzymuję prośbę o podanie hasła. Mój komputer używa systemu Windows 8. –

1

Podczas próby ustalenia, jak zezwolić użytkownikom na dostęp do naszej sieci, bez podawania kluczy do zamku, włączono dostęp do zdalnego pulpitu dla kilku członków mojego zespołu. Myśląc o tym więcej, szybko przypomniałem sobie projekt sprzed kilku lat, pracując dla Departamentu Obrony. Ten projekt wymagał od nas "zablokowania" dostępu tylko do niezbędnego personelu i ograniczonego dostępu do programów na serwerach. Po spędzeniu czasu w bazie wiedzy Microsoft zdaliśmy sobie sprawę, że możemy utworzyć "skróty" na pulpicie dla tych pracowników, którzy utworzyli połączenie RDP, zalogowali się i ograniczyli dostęp do jednej konkretnej aplikacji na tym serwerze.

+1

Czy to Snowden dostał informację :) (J/K) – Zuzlx

36

Jeśli chcesz użyć PowerShell można dodać poświadczenia używając

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

następnie wywołać połączenie RDP używając

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

Jeśli chcesz usunąć poświadczenia uruchomić

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

Pamiętaj, aby usunąć ""

+0

Podoba mi się to! Mam go do pracy w systemie Windows Server 2008 R2. – Alain

+0

Aby uzyskać informacje na temat wyłączania ostrzeżenia o certyfikacie, zobacz http://stackoverflow.com/a/29984647/393367. – lvmeijer

+0

czy możemy to zrobić tylko z partiami (polecenie DOS)? – LongTTH

9

To jest zaktualizowana wersja z wpisu 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

To prawie zadziałało, ale nadal muszę wprowadzić hasło –

+1

@MarekBar Twoja domena może mieć obiekt GPO zabraniający przechowywania haseł do połączeń pulpitu zdalnego. – 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

O ile ten fragment kodu może być rozwiązaniem, [w tym wyjaśnienie] (// meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. – Adam

0

Zaakceptowanych odpowiedź rozwiązuje problem, ale ma efekt uboczny pozostawiając poświadczeń w poświadczeń użytkowników sklepu. Powstaje tworzenie IDisposable, więc mogę używać poświadczeń w instrukcji using.

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(); 
     } 
    } 
} 
Powiązane problemy