Сценарий Powershell Создание групповых пользователей и назначение их нескольким группам - PullRequest
0 голосов
/ 06 ноября 2018

Я работал над сценарием, который импортирует пользователей в Active Directory, назначенных нескольким группам через PowerShell. Сценарий работает нормально, но я хотел бы знать, могу ли я улучшить сценарий, и, возможно, у вас, ребята, есть какие-либо предложения или улучшения по сценарию?

Скрипт Powershell: Import_BulkUsers.ps1

$CSVFile = "Gebruikers.csv"

$users = Import-Csv $CSVFile -delimiter ";"

$users | ForEach-Object {
    # Domain data
    $OU = $_.Afdeling
    $DomainName = "LAN.CONTOSO.COM"

    # User data
    $voornaam = $_.Voornaam
    $tussenvoegsel = $_.Tussenvoegsel
    $achternaam = $_.Achternaam
    $password = "Password1"
    $username = $voornaam.Substring(0,3) + $achternaam.Substring(0,2)

    if($tussenvoegsel -eq "") { 
        $Displayname= $voornaam + " " + $achternaam 
    } else {
        $Displayname= $voornaam + " " + $tussenvoegsel + " " + $achternaam
    }

    # Userprofile & Homefolder
    $homefolderdrive = "Z:"
    $homefolder = "\\"+$_.SRV+"\"+$_.HF+"$\"+$username
    $profilefolder = "\\"+$_.SRV+"\"+$_.UP+"$\"+$username

    # Secure password
    $SecurePass = ConvertTo-SecureString $password -AsPlainText -Force

    $UserPrincipalName = $username+"@"+$DomainName

    $userExists = (Get-ADUser -Filter { SamAccountName -eq $username }) 

        if($userExists -eq $null) {
            # New AD user 
            New-ADUser -Name $Displayname -GivenName $voornaam -Surname $achternaam -DisplayName $Displayname -SamAccountName $username -UserPrincipalName $UserPrincipalName -HomeDrive $homefolderdrive -HomeDirectory $homefolder -ProfilePath $profilefolder -Path $OU -AccountPassword $SecurePass -PasswordNeverExpires $true -Enabled $True

            # Add users to Global Groups
            $Groups = ($_.GroupName).split(",")
            foreach ($Group in $Groups) {
                    Add-ADPrincipalGroupMembership -Identity $username -MemberOf $Group
            }

            # Create homefolder
            New-Item $homefolder -Itemtype Directory | Out-Null

            Write-Host "You've created a new user:" $Displayname -fore "Green"
            Write-Host "`n"
        } else {
            # Display error on screen
            Write-Host "Not imported user:" -Fore "Yellow"
            Write-Host "User '$Displayname' already exists" -Fore "Red"
            Write-Host "`n"

            # Function write error to file
            function writetoPath() {
            $dateNow = Get-Date -Format "dd-MM-yyyy @ hh:mm:ss"
            $existingUser = "User '$Displayname' already exists"
            "$dateNow   //   $existingUser" >> C:\LogFiles\PowerShell\Import_Gebruikers.txt
            }

            # Create Path if doesn't exists
            $logfilesPath = "C:\LogFiles\PowerShell"
            if (!(Test-Path $logfilesPath)) {
                New-Item -ItemType Directory -Force -Path $logfilesPath
                writetoPath
            } else {
                writetoPath
            }
            }
}

CSV-файл: Gebruikers.csv Gebruikers.csv

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Если вы хотите добавить несколько пользователей за один снимок, попробуйте что-то вроде этого

Import-Module ActiveDirectory

$user1 = [Microsoft.ActiveDirectory.Management.ADUser]@{GivenName="John"; Surname="Doe"; SamAccountName = "JohnDoe"}

$user2 = [Microsoft.ActiveDirectory.Management.ADUser]@{GivenName="John"; Surname="Smith"; SamAccountName = "JohnSmith"}


$users = $user1, $user2

Add-ADGroupMember -Identity "YOUR-AD-GROUP" -Members $users

Так что это просто общая идея, вам нужно протестировать / настроить его. Не уверен, что он лучше вашего исходного кода.

0 голосов
/ 06 ноября 2018

Я думаю, что вам следует больше обращаться к руководству по стилю PowerShell, это облегчает чтение и изменение скрипта в будущем. Также вы должны использовать намного больше ошибок в вашем скрипте.

например, добавление обработки ошибок и упрощение:

foreach($Group in $Groups){
    try{
        Add-ADPrincipalGroupMembership -Identity $username -MemberOf $Group
        Write-Host "Successfully added groupmembership for '$username' to '$group'" -ForegroundColor Green
    }catch{
        Write-Host "Failed to add groupmembership for '$username' to '$group'" -ForegroundColor Red
    }
}

И для следующего также определенно советуем использовать try / catch, потому что сценарий останавливается, если, например, значение 1 неверно.

try{ 
    New-ADUser -Name $Displayname -GivenName $voornaam -Surname $achternaam -DisplayName $Displayname -SamAccountName $username -UserPrincipalName $UserPrincipalName -HomeDrive $homefolderdrive -HomeDirectory $homefolder -ProfilePath $profilefolder -Path $OU -AccountPassword $SecurePass -PasswordNeverExpires $true -Enabled $True
}catch{
    Write-Host "Failed to create AD user '$Displayname'" -ForegroundColor Red
}

Что вы можете сделать, чтобы предотвратить пустые значения для CMDlet New-ADUser, например:

foreach($user in $users){
    $params = @{}
    if($user.Voornaam){
        $params += @{
            givenName = $user.Voornaam
        }
    }
    if($user.Achternaam){
        $params += @{
            surName = $user.Achternaam
        }
    }
    try{
        New-ADUser @params
    }catch{
        Write-Host "Failed to create AD user '$($user.displayName)'" -ForegroundColor Red
    }
}

Таким образом, вы делаете это намного проще! Надеюсь, это поможет.

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...