Как программно редактировать ключи реестра конкретного пользователя? - PullRequest
7 голосов
/ 02 апреля 2012

Я хочу изменить несколько настроек пользователя Windows, которые я создал в своем приложении.Если я правильно понимаю, его значения "HKEY_CURRENT_USER" будут ниже HKEY_USERS/<sid>/....Это правильно?Как я могу получить sid пользователя, если я знаю имя пользователя и домен?

Редактировать: Как я могу правильно редактировать ключи HKCU этого пользователя, если у меня уже есть sid?

Ответы [ 3 ]

3 голосов
/ 03 апреля 2012

У меня есть программа, которая делает именно это.Вот соответствующая часть кода:

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

Вам потребуется импортировать два пространства имен:

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

Надеюсь, это поможет.

Затем используйте Registry.Users.SetValueсо строкой SID \ path для установки значения реестра.

Это может работать не так, как задумано, если вы редактируете вышедший профиль, особенно перемещаемый профиль.

2 голосов
/ 02 апреля 2012

Есть два шага к этому. Сначала вы должны получить sid пользователей. Во-вторых, вы должны загрузить куст реестра пользователей. Ульи других пользователей не загружаются по умолчанию, поэтому вы должны загрузить их явно.

Ответ в комментарии Дэниела Уайта - лучший способ получить sid.

Чтобы загрузить куст реестра пользователя, используйте LoadUserProfile windows API через pinvoke. Существует дополнительный UnloadUserProfile для выгрузки улья, когда вы закончите с ним.

0 голосов
/ 02 апреля 2012

Вы можете использовать Запрос по примеру и выполнять поиск, используя PrincipalSearcher для соответствующего 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();
    }
}
...