2012-04-02 17 views
7

Desidero modificare alcune impostazioni di un utente Windows che ho creato nella mia applicazione. Se ho capito bene, i suoi valori "HKEY_CURRENT_USER" saranno inferiori a HKEY_USERS/<sid>/.... È corretto? Come posso ottenere il sid dell'utente, se conosco il nome utente e il dominio?Come modificare le chiavi di registro di un utente specifico in modo programmatico?

Modifica: come posso modificare correttamente i tasti HKCU di quell'utente, se ho già il sid?

+3

possibile duplicato di [Convertire un nome utente in una stringa SID in C# /. NET] (http://stackoverflow.com/questions/1040623/convert-a-nomeutente-to-a-sid-string-in-c -net) –

+1

Solo se questo è il modo corretto di modificare l'utente. –

risposta

3

Ho un programma che fa esattamente questo. Ecco la parte rilevante del codice:

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

Sarà necessario importare due spazi dei nomi:

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

Spero che questo aiuti.

Quindi utilizzare Registry.Users.SetValue con stringa SID \ percorso per impostare il valore di registro.

Questo potrebbe non funzionare come previsto se si sta modificando un profilo disconnesso, in particolare un profilo di roaming.

+1

In realtà, dopo un'ispezione più ravvicinata, potresti non aver nemmeno bisogno di System.DirectoryServices; – deutschZuid

0

È possibile utilizzare Query by example e la ricerca utilizzando PrincipalSearcher un'adeguata 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

Quindi, quando ho il SID, è 'Registry.Users.SetValue (sid + @" \ qualunque chiave ", somevalue);'? Quel sid è nel formato giusto? –

+0

@ TamásSzelei Sarà necessario convertire sid in 'String' e quindi sì. –

2

Ci sono due passi per questo. Per prima cosa devi portare gli utenti sid. In secondo luogo è necessario caricare l'hive del Registro di sistema degli utenti. Gli hive di altri utenti non vengono caricati di default, quindi devi caricarlo esplicitamente.

La risposta nel commento di Daniel White è il modo migliore per ottenere il sid.

Per caricare l'hive del Registro di sistema dell'utente, utilizzare l'API di windows LoadUserProfile tramite pinvoke. C'è un UnloadUserProfile complementare per scaricare l'hive quando hai finito con esso.

+0

HKEY_CURRENT_USER non è lo stesso di HKEY_USERS \ ? –

+0

@ TamásSzelei sì. Vuoi modificare le impostazioni dell'utente attualmente connesso o un altro utente? –

+1

Accedere al profilo di un utente disconnesso [può causare la perdita di dati] (http://blogs.msdn.com/b/oldnewthing/archive/2005/06/30/434209.aspx). Assicurati di caricare il profilo per evitare questo problema. –

Problemi correlati