2012-07-02 31 views
26

Tôi nhận ra rằng trong Windows 7, không thể lưu các thông tin đăng nhập khác nhau cho cùng một máy chủ, nhưng tôi cần một số giải pháp thay thế.Chạy mstsc.exe với tên người dùng và mật khẩu được chỉ định

Tôi có thể cung cấp tên người dùng và mật khẩu theo cách thủ công trong mã không? Lưu trữ chúng trong một tệp .pp tạm thời?

+0

Tôi có thể sử dụng PowerShell với C#? Xin lỗi, tôi mới. – Krzysiek

+5

Về cơ bản, ý tưởng là thực thi CMDKEY.EXE để tạo thông tin xác thực tạm thời của bạn trong kho lưu trữ thông tin đăng nhập đã lưu trữ và sau đó thực thi MSTSC.EXE. MSTSC nên tìm thông tin đăng nhập và sử dụng chúng. Bạn có thể thực hiện các chương trình này từ bên trong C# bằng cách sử dụng 'Process.Start'; bạn không cần Powershell. –

+0

Làm việc như một say mê !!! Cảm ơn rất nhiều! – Krzysiek

Trả lời

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

Mã trên bắt đầu kết nối với .217 và tôi không được nhắc cung cấp mật khẩu. Cảm ơn bạn đã trợ giúp.

+2

Nếu bạn không muốn giữ thông tin đăng nhập được lưu trữ trong kho lưu trữ, sau mã này bạn có thể gọi lại 'cmdkey.exe' với đối số'/delete: TERMSRV/192.168.0.217' – chopikadze

+1

Tôi vẫn đang được nhắc nhập mật khẩu. Máy của tôi đang sử dụng công việc kinh doanh vista – Parth

+0

Tôi vẫn đang bị nhắc nhập mật khẩu. Máy của tôi đang sử dụng Windows 8. –

1

Trong khi cố gắng tìm hiểu cách cho phép người dùng vào mạng của chúng tôi, không cho họ chìa khóa vào lâu đài, tôi đã bật Truy cập máy tính từ xa cho một vài thành viên trong nhóm của mình. Suy nghĩ thêm về điều này, tôi nhanh chóng nhớ ra một dự án cách đây vài năm trong khi làm việc cho Bộ Quốc phòng. Dự án đó yêu cầu chúng tôi "khóa" quyền truy cập vào các nhân viên cần thiết và truy cập hạn chế vào các chương trình trên máy chủ. Sau khi dành một chút thời gian cho KnowledgeBase của Microsoft, chúng tôi nhận ra rằng chúng tôi có thể tạo "lối tắt" cho những nhân viên đã tạo kết nối RDP, đăng nhập và giới hạn quyền truy cập của họ vào một ứng dụng cụ thể trên máy chủ đó.

+1

Đó có phải là cách Snowden nhận được thông tin :) (J/K) – Zuzlx

36

Nếu bạn muốn sử dụng PowerShell bạn có thể thêm các thông tin sử dụng

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

Sau đó gọi kết nối RDP sử dụng

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

Nếu bạn muốn xóa các chứng chỉ chạy

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

Hãy nhớ xóa ""

+0

Tôi thích điều này! Tôi đã làm cho nó hoạt động trên Windows Server 2008 R2. – Alain

+0

Xem http://stackoverflow.com/a/29984647/393367 để biết thông tin về cách tắt cảnh báo chứng chỉ. – lvmeijer

+0

chúng ta có thể làm điều này chỉ với lô (dòng lệnh dos)? – LongTTH

9

Đây là phiên bản cập nhật từ bài đăng của 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

Nó hầu như đã hoạt động, nhưng tôi vẫn cần phải nhập mật khẩu –

+1

@MarekBar Tên miền của bạn có thể có GPO cấm lưu trữ mật khẩu cho các kết nối Remote Desktop. – 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

Mặc dù đoạn mã này có thể là giải pháp, [bao gồm giải thích] (// meta.stackexchange.com/questions/114762/explaining-entirely-‌ code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. – Adam

0

Câu trả lời được chấp nhận giải quyết vấn đề, nhưng có tác dụng phụ đến việc rời khỏi các chứng chỉ trong những người sử dụng cửa hàng ủy nhiệm. Tôi vết thương tạo ra một IDisposable vì vậy tôi có thể sử dụng các thông tin trong một tuyên bố sử dụng.

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(); 
     } 
    } 
} 
Các vấn đề liên quan