2011-07-03 35 views

Trả lời

11

Bạn có thể mạo danh người dùng và sau đó thay đổi sổ đăng ký cho ngữ cảnh hiện tại đó. Dưới đây là một vài tài nguyên trên C# và Mạo danh:

using(var impersonation = new Impersonate(username,password)) 
{ 
    ChangeRegistry(keys, values); 
} 

Và khi:

một cái gì đó như thế này (giả) Những gì bạn muốn làm là mạo danh được xử lý, bạn sẽ quay trở lại bằng cách sử dụng lại người dùng đang chạy. Here is an example implementation của lớp Mạo danh triển khai IDisposable để hoạt động giống như giả exampel được hiển thị ở trên và here is another example.

Here is an example vào cách bạn thay đổi giá trị registry:

var registry = Registry.CurrentUser; 
var key = 
registry.OpenSubKey(
    @"HKEY_CURRENT_USER\Some\Path\That\You\Want\ToChange", true); 

key.SetValue(null, "");    
Registry.CurrentUser.Flush(); 

Cập nhật

Vì vậy, những gì bạn cần làm để truy cập HKCU là bạn cũng phải nạp hồ sơ người dùng. Điều này được thực hiện bằng cách gọi phương thức Win32 khác được gọi là LoadUserProfile. Có một complete example here mà bạn có thể sử dụng, nhưng tôi sẽ bao gồm các bit quan trọng ở đây.

Trước tiên, bạn cần phải bao gồm các phương pháp Win32 như thế này:

[DllImport("userenv.dll", SetLastError = true, CharSet = CharSet.Auto)] 
public static extern bool LoadUserProfile(IntPtr hToken, 
             ref ProfileInfo lpProfileInfo); 

[DllImport("userenv.dll", CallingConvention = CallingConvention.Winapi, 
          SetLastError = true, CharSet = CharSet.Auto)] 
public static extern bool UnloadUserProfile(IntPtr hToken, 
                IntPtr lpProfileInfo); 

Bên mạo danh của bạn sử dụng khối bạn cần phải làm như sau:

ProfileInfo profileInfo = new ProfileInfo(); 
profileInfo.dwSize = Marshal.SizeOf(profileInfo); 
profileInfo.lpUserName = userName; 
profileInfo.dwFlags = 1; 
Boolean loadSuccess = LoadUserProfile(tokenDuplicate, ref profileInfo); 

Và sau này, bạn sẽ có thể truy cập vào HKCU. Khi bạn hoàn tất, bạn cần phải hủy hồ sơ bằng cách sử dụng UnloadUserProfile(tokenDuplicate, profileInfo.hProfile);.

+0

Cảm ơn rất nhiều nhưng nó không hoạt động, nó đã thay đổi sổ đăng ký của người dùng hiện tại chứ không phải người dùng bị mạo danh! –

+0

Bạn có chắc chắn rằng sự mạo danh đã diễn ra? Bạn có thể thử và in ra danh tính người dùng hiện tại và xem nó thực sự là ai. Ngoài ra, đây là ứng dụng ASP.NET và ứng dụng Windows? Nếu đó là một ứng dụng Web, bạn cần phải cho phép mạo danh. –

+0

Không, nó là một ứng dụng WPF. sử dụng (ImpersonatedUser im = new ImpersonatedUser ("aaa", Environment.MachineName, "1")) { Registry.CurrentUser.CreateSubKey ("TMP10"); Registry.CurrentUser.Flush(); } Nó tạo khóa trong người dùng hiện tại nhưng không có trong 'aaa': ( –

3

Bạn có hai tùy chọn. Bạn có thể mạo danh người dùng đó nếu bạn có thông tin đăng nhập của mình như Filip Ekberg thể hiện rõ hơn; hoặc

HKCU chỉ là một liên kết tượng trưng cho một trong các phím dưới HKEY_USERS. Nếu bạn biết SID của người dùng đó, thì bạn có thể tìm thấy nó trong đó. Bạn có thể nhận được SID như vậy:

var account = new NTAccount("userName"); 
var identifier = (SecurityIdentifier)account.Translate(typeof(SecurityIdentifier)); 
var sid = identifier.Value; 

Tùy chọn tốt hơn là mạo danh. Tùy chọn thứ hai có thể hoạt động tốt hơn khi bạn không biết thông tin đăng nhập của người dùng đó. Bất lợi là bạn sẽ cần quyền quản trị để viết vào tài khoản của người khác.

+0

Sự mạo danh không hiệu quả, nhưng sid rất hữu ích nhưng tôi đã đụng độ với ngoại lệ truy cập trái phép, mặc dù UAC bị tắt và tôi là quản trị viên! –

+0

@MSS, hãy thử yêu cầu quyền nâng cao. –

+0

Nó làm việc, sai lầm của tôi là tôi đã mở chìa khóa để đọc !! lỗi: var key = Registry.Users.OpenSubKey (sid); bên phải là: var key = Registry.Users.OpenSubKey (sid. true); !!! –

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