Я использую DirectoryServices и поставщик WinNT: // для подключения к удаленному компьютеру.Затем я проверяю некоторую информацию о членстве в группе и, возможно, добавляю или удаляю пользователя домена из указанной локальной группы.
Я смог заставить весь этот код работать без помех, используя консольное приложение vb.net и когдасвязь с моим локальным ящиком или с любым ящиком, в котором учетная запись, в которую я вошел, имеет административные права.
Код:
string strUserPath = "WinNT://DomainName/someuser,user";
DirectoryEntry deComputer = new DirectoryEntry("WinNT://" + Computername + ",computer");
deComputer.RefreshCache();
DirectoryEntry deGroup = deComputer.Children.Find("administrators", "group");
IEnumerable members = deGroup.Invoke("members", null);
List<DirectoryEntry> r = new List<DirectoryEntry>();
foreach (object o in members)
{
DirectoryEntry deMember = new DirectoryEntry(o);
r.Add(deMember);
}
deGroup.Invoke("Add", strUserPath);
deGroup.CommitChanges();
deGroup.Invoke("Remove", strUserPath);
deGroup.CommitChanges();
Поэтому я перенес код в сеть ASP.Netприложение, которое олицетворяет учетную запись службы через раздел Impersonate в web.config.Учетная запись, которую я олицетворяю, не имеет прав администратора ни на одной из рабочих станций, поэтому я ввел имя пользователя / пароль в конструктор для записи компьютера следующим образом:
DirectoryEntry deComputer = new DirectoryEntry("WinNT://" + Computername + ",computer", username, password);
Имя пользователя - это имя учетной записи доменакоторый имеет права локального администратора на каждой рабочей станции.Если я посмотрю на свойство Username получившегося объекта deComputer, то увижу, что имя пользователя совпадает с тем, что я ввел.Кроме того, если я ввожу неверный пароль, он выдаст ошибку, поэтому он аутентифицируется некоторым образом.
Однако, если я сейчас пытаюсь добавить или удалить пользователя с удаленной рабочей станции, я получаю общую ошибку отказа в доступе.Если я добавлю учетную запись службы, которую ASP.Net использует в качестве локального администратора на этой рабочей станции, она не добавит и не создаст проблем.
Итак, затем я попытался использовать LogonAPI (вызов advapi32.dll -> LogonUser) длявойдите в систему как учетная запись пользователя, которая является локальным администратором на всех рабочих станциях, олицетворяет результирующую WindowsIdentitiy и пытается запустить только оригинальное создание deComputer.Когда я делаю это, каждое свойство, за исключением Path, возвращает OLE-исключение ...
Я совершенно заблудился, что делать дальше.Любая помощь будет принята с благодарностью.
- Обходной путь -
Чтобы обойти эту проблему, мы создали службу Windows, которая работает под учетной записью локального администратора и, таким образом, нене было никаких проблем с запуском кода.Мы помещаем все наши обновления в таблицу в базе данных SQL, и служба забирает их и обрабатывает.НО, я все еще очень хотел бы знать, почему это не работает, и было бы неплохо размещать обновления прямо с веб-сайта.