2011-02-09 43 views
7

Tôi đang viết một ứng dụng cần tạo tài khoản người dùng đặc biệt ẩn khỏi màn hình đăng nhập và ứng dụng người dùng Bảng điều khiển. Bằng cách viết một giá trị từ 0 DWORD với tên người dùng đến khóa registry dưới đây, tôi có thể hoàn thành mục tiêu này:Không thể ghi vào sổ đăng ký theo HKEY_LOCAL_MACHINE Software

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ SpecialAccounts \ danh sách người dùng

Vấn đề là trong Windows 7 với UAC, bất kể tôi cố gắng làm gì, tôi không thể viết một giá trị cho khóa ở trên.

Đó là sự hiểu biết của tôi rằng viết cho một số phím này không được phép trên Windows 7 với UAC, trừ khi bạn đang chạy với quyền quản trị. Tôi đã thêm một biểu hiện ứng dụng requestedExecutionLevel level="requireAdministrator" uiAccess="false", tôi chấp nhận lời nhắc UAC khi chương trình của tôi được chạy, tài khoản của tôi là thành viên của Quản trị viên, nhưng tôi vẫn không thể ghi vào khóa đăng ký ở trên.

Tôi còn cần phải làm gì nữa? Làm thế nào có thể, trong bất kỳ cấu hình ứng dụng nào, để viết các khóa và giá trị theo HKEY_LOCAL_MACHINE\SOFTWARE?

Thông tin khác ... Khi chương trình của tôi chạy, không có lỗi nào được ném và dường như viết giá trị. Tôi đoán là Windows đang ảo hóa vị trí mà tôi đang viết. Tôi cần phải ghi vào vị trí thực tế, không phải là một địa chỉ ảo, nếu tôi ẩn tài khoản người dùng đặc biệt này.

+0

Họ có thể đang cố gắng để ngăn chặn chính xác những gì bạn đang cố gắng làm. Một tài khoản ẩn được viết bởi phần mềm độc hại sẽ là xấu ví dụ. – asawyer

+0

Tuy nhiên, điều này áp dụng cho tất cả mọi thứ theo HKEY_LOCAL_MACHINE \ SOFTWARE, không chỉ là khóa cụ thể mà tôi đã đề cập. Oh, và bạn vẫn có thể ẩn tài khoản bằng cách sử dụng regedit, hoặc nhìn thấy nó bằng cách sử dụng quản lý máy tính/người dùng. – sysrpl

+0

Xin lỗi, đó chỉ là một nhận xét tắt tiếng. Nếu tôi có một câu trả lời tốt cho bạn, tôi đã sử dụng hộp khác. Tôi cũng rất quan tâm đến những gì đang diễn ra ở đây. – asawyer

Trả lời

12

Có lẽ chương trình chạy dưới dạng chương trình 32 bit trên hệ điều hành 64 bit? Trong trường hợp tôi khuyên bạn nên tìm kiếm các giá trị bạn đã tạo theo số Wow6432Node khóa con của HKEY_LOCAL_MACHINE\SOFTWARE.

Bạn có thể đọc thêm về loại ảo hóa như vậy here. Bạn có thể sử dụng KEY_WOW64_32KEY flag trong một số API để có thể làm việc với toàn bộ đăng ký mà không cần ảo hóa.

+0

Phải, tôi đã tìm ra các giá trị được viết dưới Wow6432Node. Vấn đề là, người dùng ẩn mã trên cửa sổ không thấy các phím dưới vị trí đó. Xem http://social.answers.microsoft.com/Forums/en-SG/w7security/thread/e4d1c727-a0b3-4ce8-b95e-7f113b576ee6 và http://community.kaseya.com/xsp/f/21/p /223/646.aspx ... Liên kết đầu tiên được đánh dấu là đã được giải quyết thông qua bản sửa lỗi riêng tư bằng cách cài đặt khiên, và như vậy sửa chữa nó không được phân phối lại một cách công khai. – sysrpl

+0

@sysrpl: Vấn đề có thể được giải quyết dễ dàng nếu bạn sử dụng cờ 'KEY_WOW64_32KEY' bổ sung trong 'RegCreateKeyEx' hoặc' RegOpenKeyEx'. Sau đó, bạn có thể sử dụng xử lý 'HKEY' để truy cập bất kỳ phần nào của sổ đăng ký. Tôi sử dụng các trick mà không có bất kỳ vấn đề. Nếu bạn cần tôi có thể đăng một ví dụ C nhỏ mà chứng minh nó. – Oleg

+0

@sysrpl: Sử dụng có cần tạo khóa đăng ký bên trong thiết lập không? – Oleg

0

Điều này có thể liên quan đến chuyển hướng mà họ đã thêm vào trong Vista. Tôi sẽ tò mò nếu bạn đã cố đọc giá trị đăng ký đó từ mã của bạn, nếu bạn sẽ lấy lại giá trị bạn mong đợi. Bạn cũng có thể muốn kích hoạt RegMon để xem liệu bạn có thể thấy nơi chuyển hướng có thể đang buộc bạn.

1

ghi giá trị vào Registry

string user = Environment.UserDomainName + "\\" + Environment.UserName; 

RegistrySecurity rs = new RegistrySecurity(); 

rs.AddAccessRule(new RegistryAccessRule(user, 
    RegistryRights.WriteKey | RegistryRights.ChangePermissions, 
    InheritanceFlags.None, PropagationFlags.None, AccessControlType.Deny)); 

RegistryKey rk = null; 
try 
{ 
    rk = Registry.CurrentUser.CreateSubKey("SOFTWARE\\TEST", 
            RegistryKeyPermissionCheck.Default, rs); 
    rk.SetValue("NAME", "IROSH); 
    rk.SetValue("FROM", "SRI LANKA"); 
} 
0
RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true); 
rk.SetValue("Name", "Value"); 
+2

viết một số giải thích cho mã của bạn, để làm cho câu trả lời của bạn tốt hơn –

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