2010-03-29 15 views
13

This .NET API hoạt động OK nếu tôi đang cố mở Registry trong một máy có cùng tên miền với tôi (và người dùng đã đăng nhập của tôi có quyền quản trị trên máy đích).Làm cách nào để chuyển thông tin đăng nhập vào máy để tôi có thể sử dụng Microsoft.Win32.RegistryKey.OpenRemoteBaseKey() trên đó?

Sẽ phức tạp nếu đó là máy ngoài miền với một người dùng quản trị cục bộ khác (mà tôi có mật khẩu).

Tôi đã cố gắng sử dụng WNetUseConnection() (đã phục vụ tốt cho tôi trong những tình huống mà tôi muốn đọc tệp từ xa) trước khi gọi OpenRemoteBaseKey(), nhưng không có xúc xắc - Tôi nhận được quyền truy cập bị từ chối ngoại lệ .

Rõ ràng, tôi phải vượt qua bằng chứng một số cách khác, nhưng làm cách nào?

Trả lời

32

Những gì tôi đã sử dụng thành công để truy xuất file trên máy tính là đoạn mã sau:

#region imports 
     [DllImport("advapi32.dll", SetLastError = true)] 
     private static extern bool LogonUser(string 
     lpszUsername, string lpszDomain, string lpszPassword, 
     int dwLogonType, int dwLogonProvider, ref 
IntPtr phToken); 


     [DllImport("kernel32.dll", CharSet = CharSet.Auto, 
     SetLastError = true)] 
     private static extern bool CloseHandle(IntPtr handle 
     ); 

     [DllImport("advapi32.dll", CharSet = CharSet.Auto, 
     SetLastError = true)] 
     public extern static bool DuplicateToken(IntPtr 
     existingTokenHandle, 
     int SECURITY_IMPERSONATION_LEVEL, ref IntPtr 
     duplicateTokenHandle); 
     #endregion 
     #region logon consts 
     // logon types 
     const int LOGON32_LOGON_INTERACTIVE = 2; 
     const int LOGON32_LOGON_NETWORK = 3; 
     const int LOGON32_LOGON_NEW_CREDENTIALS = 9; 

     // logon providers 
     const int LOGON32_PROVIDER_DEFAULT = 0; 
     const int LOGON32_PROVIDER_WINNT50 = 3; 
     const int LOGON32_PROVIDER_WINNT40 = 2; 
     const int LOGON32_PROVIDER_WINNT35 = 1; 
     #endregion 

Và sau đó để ký kết một phần, chỉ cần sử dụng:

 IntPtr token = IntPtr.Zero; 

     bool isSuccess = LogonUser("username", "domain", "password", 
     LOGON32_LOGON_NEW_CREDENTIALS, 
     LOGON32_PROVIDER_DEFAULT, ref token); 
     using (WindowsImpersonationContext person = new WindowsIdentity(token).Impersonate()) 
     { 
     //do your thing 
     person.Undo(); 
     } 

Như bạn có thể thấy, "Hoàn tác()" sẽ khiến bạn không còn đăng nhập với tư cách người dùng đó nữa. Vì vậy, không sử dụng nó trước khi bạn hoàn tất. Nhưng đừng quên sử dụng nó!

+2

+1 Đây thực sự là cách duy nhất để làm điều đó. – Nate

+0

Tôi có thể giữ biến "mã thông báo" trong khoảng thời gian dài và sau đó sử dụng khối "sử dụng/Hoàn tác()" tại các điểm khác nhau trong chế ngự bằng cùng một mã thông báo? " – JCCyC

+0

Tôi nghĩ vậy. Đó là Mạo danh thực sự đăng nhập. Những gì tôi đã sử dụng là một "GetImpersonation()" mà trả về một WindowsImpersonationContext như trên –

Các vấn đề liên quan