2011-02-09 13 views
7

Piszę aplikację, która musi utworzyć specjalne konto użytkownika ukryte przed ekranami logowania i apletem użytkowników panelu sterowania. Pisząc wartość DWORD z 0 z nazwą użytkownika do klucza rejestru poniżej, jestem w stanie osiągnąć ten cel:Nie można zapisać w Rejestrze pod HKEY_LOCAL_MACHINE Software

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ SpecialAccounts \ UserList

Problem polega na tym, że w systemie Windows 7 z włączonym UAC, bez względu na to, co próbuję, nie mogę programowo napisać wartości do powyższego klucza.

Rozumiem, że pisanie do niektórych kluczy jest niedozwolone w systemie Windows 7 z włączoną funkcją Kontrola konta użytkownika, chyba że używasz uprawnień administracyjnych. Dodałem manifest aplikacji requestedExecutionLevel level="requireAdministrator" uiAccess="false", Akceptuję monit UAC, gdy mój program jest uruchamiany, moje konto jest członkiem Administratorów, ale nadal nie mogę napisać do powyższego klucza rejestru.

Co jeszcze muszę zrobić? W jaki sposób w dowolnej konfiguracji aplikacji można pisać klucze i wartości pod numerem HKEY_LOCAL_MACHINE\SOFTWARE?

Dalsze informacje ... Po uruchomieniu mojego programu nie są zgłaszane żadne błędy i wydaje się, że wpisano wartości. Domyślam się, że Windows wirtualizuje lokalizację, do której piszę. Muszę napisać do rzeczywistej lokalizacji, a nie wirtualnej, jeśli chcę ukryć to specjalne konto użytkownika.

+0

Prawdopodobnie próbują zapobiec dokładnie, co staramy się robić. Ukryte konto napisane przez złośliwe oprogramowanie byłoby na przykład złe. – asawyer

+0

Jednak dotyczy to wszystkiego pod HKEY_LOCAL_MACHINE \ SOFTWARE, a nie tylko konkretnego klucza, o którym wspomniałem. Aha, i nadal możesz ukryć konto za pomocą regedit, lub zobaczyć to za pomocą zarządzania komputerem/użytkowników. – sysrpl

+0

Przepraszam, że to był tylko komentarz od mankietu. Gdybym miał dla ciebie dobrą odpowiedź, użyłbym drugiego pudełka. Jestem również bardzo zainteresowany tym, co się tutaj dzieje. – asawyer

Odpowiedz

12

Prawdopodobnie program działa jako program 32-bitowy w 64-bitowym systemie operacyjnym? W przypadku polecam ci przeszukać wartości, które utworzyłeś pod podkluczem Wow6432Node z HKEY_LOCAL_MACHINE\SOFTWARE.

Możesz przeczytać więcej o tego rodzaju wirtualizacji here. Możesz użyć KEY_WOW64_32KEY flag w niektórych interfejsach API, aby móc pracować z pełnym rejestrem bez wirtualizacji.

+0

W porządku, już poznałem wartości, które zostały napisane pod Wow6432Node. Problem polega na tym, że ukrywanie kodu użytkownika w systemie Windows nie powoduje wyświetlenia kluczy pod tą lokalizacją. Zobacz http://social.answers.microsoft.com/Forums/en-SG/w7security/thread/e4d1c727-a0b3-4ce8-b95e-7f113b576ee6 i http://community.kaseya.com/xsp/f/21/p /223/646.aspx ... Pierwszy odsyłacz został oznaczony jako rozwiązany przez prywatną poprawkę przez zainstalowanie tarczy, a jako taka nie jest rozprowadzana otwarcie. – sysrpl

+0

@sysrpl: Problem można łatwo rozwiązać, jeśli użyjesz dodatkowej flagi 'KEY_WOW64_32KEY' w' RegCreateKeyEx' lub 'RegOpenKeyEx'. Następnie możesz użyć uchwytu 'HKEY', aby uzyskać dostęp do dowolnej części rejestru. Używam tej sztuczki bez żadnego problemu. Jeśli potrzebujesz, mogę opublikować mały przykład C, który to demonstruje. – Oleg

+0

@sysrpl: Czy trzeba użyć klucza rejestru wewnątrz instalacji? – Oleg

0

Może to mieć coś wspólnego z przekierowaniem, które dodali w Vista. Byłbym ciekawy, czy próbowałeś odczytać tę wartość rejestru ze swojego kodu, gdybyś otrzymał wartość, której oczekiwałeś. Możesz również uruchomić RegMon, aby sprawdzić, czy możesz przekonać Cię do przekierowania.

1

zapisać wartości do rejestru

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

napisz objaśnienia kodu, aby poprawić swoją odpowiedź –

Powiązane problemy