2012-04-02 29 views
7

Tôi muốn thay đổi một vài cài đặt của người dùng Windows mà tôi đã tạo trong ứng dụng của mình. Nếu tôi hiểu chính xác, giá trị "HKEY_CURRENT_USER" của bạn sẽ ở dưới HKEY_USERS/<sid>/.... Điều này có đúng không? Làm thế nào tôi có thể nhận được sid của người sử dụng, nếu tôi biết tên người dùng và tên miền?Làm cách nào để chỉnh sửa khóa đăng ký của một người dùng cụ thể theo chương trình?

Chỉnh sửa: Làm thế nào tôi có thể chỉnh sửa chính xác các khóa HKCU của người dùng đó, nếu tôi đã có sid?

+3

bản sao có thể có của [Chuyển đổi tên người dùng thành chuỗi SID trong C# /. NET] (http://stackoverflow.com/questions/1040623/convert-a-username-to-a-sid-string-in-c -net) –

+1

Chỉ khi đó là cách chính xác để chỉnh sửa người dùng. –

Trả lời

3

Tôi có một chương trình thực hiện chính xác điều đó. Dưới đây là phần có liên quan của mã:

NTAccount ntuser = new NTAccount(strUser); 
SecurityIdentifier sID = (SecurityIdentifier) ntuser.Translate(typeof(SecurityIdentifier)); 
strSID = sID.ToString(); 

Bạn sẽ cần phải nhập khẩu hai không gian tên:

using System.DirectoryServices; 
using System.Security.Principal; 

Hope this helps.

Sau đó, sử dụng Registry.Users.SetValue với chuỗi SID \ đường dẫn để đặt giá trị đăng ký.

Điều này có thể không hoạt động như dự định nếu bạn đang chỉnh sửa cấu hình đã đăng xuất, đặc biệt là hồ sơ chuyển vùng.

+1

Trên thực tế khi kiểm tra chặt chẽ hơn, bạn có thể thậm chí không cần System.DirectoryServices; – deutschZuid

0

Bạn có thể sử dụng Query by example và tìm kiếm bằng PrincipalSearcher cho phù hợp UserPrincipal

// Since you know the domain and user 
PrincipalContext context = new PrincipalContext(ContextType.Domain); 

// Create the principal user object from the context 
UserPrincipal usr = new UserPrincipal(context); 
usr .GivenName = "Jim"; 
usr .Surname = "Daly"; 

// Create a PrincipalSearcher object. 
PrincipalSearcher ps = new PrincipalSearcher(usr); 
PrincipalSearchResult<Principal> results = ps.FindAll(); 
foreach (UserPrincipal user in results) { 
    if(user.DisplayName == userName) { 
     var usersSid = user.Sid.ToString(); 
    } 
} 
+0

Vì vậy, khi tôi có SID, là nó 'Registry.Users.SetValue (sid + @" \ bất kỳ phím ", somevalue);'? Đó có phải là sid ở định dạng đúng không? –

+0

@ TamásSzelei Bạn sẽ cần phải chuyển đổi sid sang 'String' và sau đó có. –

2

Có hai bước này. Trước tiên, bạn phải có được người dùng sid. Thứ hai, bạn phải tải hive đăng ký người dùng. Những người dùng khác phát ban không được tải theo mặc định, do đó bạn phải tải nó một cách rõ ràng.

Câu trả lời trong nhận xét của Daniel White là cách tốt nhất để có được sid.

Để tải tổ chức đăng ký của người dùng, hãy sử dụng API cửa sổ LoadUserProfile qua pinvoke. Có một UnloadUserProfile bổ sung để dỡ bỏ tổ ong khi bạn đã hoàn thành nó.

+0

Không phải HKEY_CURRENT_USER giống với HKEY_USERS \ ? –

+0

@ TamásSzelei có. Bạn có muốn chỉnh sửa cài đặt của người dùng hiện đã đăng nhập hoặc người dùng khác không? –

+1

Truy cập vào hồ sơ của người dùng đã đăng xuất [có thể dẫn đến mất dữ liệu] (http://blogs.msdn.com/b/oldnewthing/archive/2005/06/30/434209.aspx). Đảm bảo bạn tải cấu hình để tránh sự cố này. –

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