13 июля 2012 г.

Работа с кустом HKEY_USERS или преобразование USER->SID с помощью C#

Продолжая автоматизировать свою деятельность с помощью самописных программок столкнулся с проблемой записи в куст HKEY_CURRENT_USER. Удалённо записать туда не представляется возможных, лишь только если сам пользователь запустит нужный мне скрипт или программу. Но выход есть. Все пользователи указанного компьютера имеют ветку в кусте HKEY_USERS, но добраться до неё можно лишь узнав SID (Security Identificator, идентификатор безопасности), под которым пользователь компьютера там числится.

Первым делом пришло в голову получить SID необходимого мне пользователя с помощью WMI. Оказалось это сделать можно, но запрос выполняется долго, т.к. в нашем домене порядка 3 тысяч машин, а пользователей ещё больше. Поэтому было решено искать другие решения данной задачи. И оно было незамедлительно найдено на каком-то буржуйском сайте. Точнее там я нашёл намёк куда копать. В итоге получил такое решение:
using System;
using System.Security.Principal;
using Microsoft.Win32;

namespace WMISample
{
 public class MyWMIQuery
 {
  static string GetAccountSid(string DomainUserAccount)
  {
   NTAccount f = new NTAccount(DomainUserAccount);
   SecurityIdentifier s = (SecurityIdentifier)f.Translate(typeof(SecurityIdentifier));
   String sidString = s.ToString();
   return sidString;
  }

  public static void Main()
  {
   string comp = "RemoteCompName";
   string sid = GetAccountSid("DomainUserAccount");
   Console.WriteLine("SID пользователя " + sid);

   RegistryKey key = RegistryKey.OpenRemoteBaseKey(RegistryHive.Users, comp)
    .OpenSubKey(sid + @"\Environment", true);
   key.SetValue("SAP", "1504");
  }
 }
}
В общем, ничего сложного, как оказалось))

Комментариев нет:

Отправить комментарий

Уважаемый комментатор, пишите грамотно.
С благодарностью, автор блога.