Главная > Администрирование, Powershell > Работа с учётными записями пользователей через Powershell

Работа с учётными записями пользователей через Powershell

Недавно ко мне обратились с просьбой о помощи, тем самым подкинув интересную задачу. Опуская подробности – нужно было узнать на каких компьютерах сети пользователи являются членами группы “Администраторы” не считая самого администратора (с учётной записью admin). Ни серверов, ни каких-либо средств централизованного управления в сети не было. Сеть в основном построена на Windows XP, но попадались и динозавры с Windows 98 (да, такие ещё есть).

Сразу пришло в голову два варианта:

  • на самом компьютере посмотреть в консоли “Управление компьютером”
  • подключиться к консоли компьютера по сети

Разумеется оба не являются удовлетворительными, так как в первом нужно подходить к каждому компьютеру сгоняя с него пользователя, а во-втором долго и нудно коннектиться ко всем компьютерам подряд, выбирая и выписывая “админов”. Так родился третий вариант – скрипт на Powershell.

Действовать решил через технологию ADSI, а заодно и познакомиться с ней, так как раньше сталкиваться не приходилось. Алгоритм прост: обойти все компьютеры, на каждом просмотреть группу “Администраторы” и если будут найдены пользователи с логином отличным от admin — вывести его логин (также было пожелание по возможности записать в файл).

Для начала немного теории.

Технология ADSI (Active Directory Service Interface) представляет собой набор объектов, обеспечивающих единообразный доступ к функциям различных каталогов. ADSI объекты включены в операционные системы Windows начиная с Windows 2000.

Для того, чтобы обратиться к объекту ADSI нужно указать его имя, которое определяется расположением этого объекта в каталоге, в котором он находится.

Для того, чтобы находить объекты в каталоге по их именам, необходимо определить для этого каталога Пространство имен (namespace). Например, файлы на жестком диске находятся в пространстве имен файловой системы.

Для ADSI имена состоят из двух частей. Первая часть имени определяет, к какой службе каталогов (к какому провайдеру ADSI) нужно обратиться:

  • LDAP:// — для службы каталогов, созданной на основе протокола LDAP (Lightweight Directory Access Protocol), в том числе для Active Directory в Windows 2000/2003/2008;
  • WinNT:// — для службы каталогов в сети Windows NT 4.0 или на локальной рабочей станции Windows 2000/XP/Vista.
  • NDS:// – для службы каталогов NetWare NDS (Novell Directory Service).
  • NWCOMPAT:// – для службы каталогов NetWare Bindery

Вторая часть определяет расположение объекта в каталоге. Например, имя пользователя User, на компьютере Computer будет выглядеть так:

WinNT://Computer/user

К сожалению в Powershell нет командлетов для работы с ADSI (по крайней мере я не нашёл), поэтому для работы с ADSI-объектами нужно просто указать тип перед именем объекта. Например, обращение к вышеуказанному пользователю будет иметь такой вид:

$user = [ADSI]("WinNT://Computer/User")

При чём, как выяснилось в процессе для WinNT важен регистр – оно должно быть написано именно так, иначе выдаст ошибку.

Для того, чтобы посмотреть членов группы пользователей на всех компьютерах нужно предварительно для каждого компьютера сформировать путь к группе пользователей, состоящий из имени компьютера и названия группы. Также нужно создать файл, в который в последствии будем записывать результаты поиска:

# Локальная группа "Администраторы" на компьютере
$Local_Group = "Администраторы"

# Список компьютеров
$Computers = Get-Network

# Файл, куда будем сохранять результаты
$file = "C:\Users.txt"
New-Item -ItemType "file" -Path $file -Force | Out-Null

Get-Network – функция, получающая сетевое окружение.

После того как всё подготовлено обходим все компьютеры, заглядывая в группу администраторов, и если находим там пользователей отличных от admin выводим их логины на экран и записываем в файл:

foreach ($Computer in $Computers)
{
    if (Test-Connection $Computer -Count 1 -Quiet)
    {
        $Path = "WinNT://" + $Computer + "/" + $Local_Group
        
        # Пытаемся определить пользователей
        try
        {
            "`n ------- Компьютер: $Computer ------- `n"
            "`n ------- Компьютер:`t$Computer ------- `n" |
            Out-File $file -Append
            $Group = [ADSI]"$Path"
            $Members = @($Group.Invoke("Members"))
            $Members | ForEach-Object `
            {
                $user = $_.GetType().InvokeMember("Name", 'GetProperty',
                        $null, $_, $null)
                                
                # Если пользователь не admin выводим его имя и сохраняем в файл
                if ($user -ne "admin")
                {
                    $user
                    $user | Out-File $file -Append
                }
            }
        }
        catch
        {
            Write-Warning $_
            "Не удалось определить пользователей:" | Out-File $file -Append
            "$_" | Out-File $file -Append
        }
    }
}

Результаты выводятся в виде:

——- Компьютер: computer-1 ——-

Vasya

Ivan

——- Компьютер: computer-2 ——-

Petya

В таком же виде заносятся в файл.

Реклама
  1. Kazun
    29/05/2011 в 22:11

    Тема уже избита донельзя.

    try-catch — блок здесь не работает,как хотелось бы,поэтому он лишний(лучше воспользоваться [adsi]::Exists(«WinNT://localhost/Администраторы») ).
    По мне так лучше сделать немного по компактнее — ([ADSI]»$Path»).Invoke(«Members») | Foreach{..}.

    • 30/05/2011 в 12:59

      «Тема уже избита донельзя» — а я и не говорил, что я Америку открываю, я просто описываю то, с чем приходится сталкиваться.
      «try-catch – блок здесь не работает,как хотелось бы» — у меня отработал как положено.

  2. Kazun
    30/05/2011 в 16:15

    Да по поводу try-catch,я ошибся.Смутил момент,что ошибка возникает — $Group = [ADSI]»$Path» ,а в блок catch попадает только в случаи выполнения — $Members = @($Group.Invoke(«Members»)),что не логично.

  3. Интерес
    29/09/2014 в 07:31

    Вопрос такой — список юзеров — локальных админов мы собрали, а как их всех (кроме учётки admin) перенести в другую группу? Например в опытные пользователи

  1. No trackbacks yet.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: