Powershell: удаленное создание локальных администраторов - PullRequest
0 голосов
/ 17 июня 2020

Я собираюсь создать локального администратора на небольшом количестве машин (> 30). Я действительно не хочу использовать GPO, если мне это сойдет с рук. LAPS - это небольшой перебор для того, что мне нужно.

Я нашел хороший скрипт в сети , но он только создает пользователя и не добавляет его в группу администраторов. Может кто видит ошибку?

#Define variables
$computers = Get-Content C:\Computers.txt
#$computers = Import-CSV C:\Computers.txt | select Computer
$username = "Admin"
$password = "Password99"
$fullname = "Admin"
$local_security_group = "Administrators"
$description = "Description"

Foreach ($computer in $computers) {
    $users = $null
    $comp = [ADSI]"WinNT://$computer"

    #Check if username exists
    Try {
        $users = $comp.psbase.children | select -expand name
        if ($users -like $username) {
            Write-Host "$username already exists on $computer"

        } else {
            #Create the account
            $user = $comp.Create("User", "$username")
            $user.SetPassword("$password")
            $user.Put("Description", "$description")
            $user.Put("Fullname", "$fullname")
            $user.SetInfo()

            #Set password to never expire
            #And set user cannot change password
            $ADS_UF_DONT_EXPIRE_PASSWD = 0x10000
            $ADS_UF_PASSWD_CANT_CHANGE = 0x40
            $user.userflags = $ADS_UF_DONT_EXPIRE_PASSWD + $ADS_UF_PASSWD_CANT_CHANGE
            $user.SetInfo()

            #Add the account to the local admins group
            $group = ([ADSI]"WinNT://$computer/$local_security_group,group")
            $username = [ADSI]"WinNT://$Computer/$username,user"

            #Validate whether user account has been created or not
            $users = $comp.psbase.children | select -expand name
            if ($users -like $username) {
                Write-Host "$username has been created on $computer"
            } else {
                Write-Host "$username has not been created on $computer"
            }
        }
    }

    Catch {
        Write-Host "Error creating $username on $($computer.path):  $($Error[0].Exception.Message)"
    }
}

1 Ответ

0 голосов
/ 17 июня 2020

В вашем коде вы фактически не добавляете пользователя в группу.

Здесь вы фактически извлекаете объект группы, но вы ничего с ним не делаете.

#Add the account to the local admins group
$group = ([ADSI]"WinNT://$computer/$local_security_group,group")
$username  = [ADSI]"WinNT://$Computer/$username,user"

Сначала вы должны удалить присвоение $username. Затем вы должны вызвать метод объекта $group, чтобы добавить пользователя:

#Add the account to the local admins group
$group = ([ADSI]"WinNT://$computer/$local_security_group,group")
$computerHostName = (Get-WmiObject -ComputerName $computer Win32_ComputerSystem).Name
$group.Add([ADSI]"WinNT://$computerHostName/$username,user")

Здесь есть одна загвоздка. Обратите внимание, что я использую Get-WmiObject, чтобы получить имя хоста с компьютера. При использовании метода Add() имя компьютера должно быть неполным именем хоста. Например, server-01, а НЕ server-01.domain.lan

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

$adsiUser = [ADSI]"WinNT://$Computer/$username,user"
...