Сценарии предназначены для создания и удаления учетных записей, корневых папок для перенаправленных папок пользователей и соответствующих ссылок DFS

function New-Employee
{
    <#
    .SYNOPSIS
    Командлет предназначен для создания нового пользователя
    .DESCRIPTION
    Командлет на основании эталонной учетной записи создает новую 
    учетную запись, корневую папку для перенаправленных папок 
    пользователя и соответствующую ссылку в DFS
    .INPUTS
    -
    .OUTPUTS
    -    
    .NOTES
    Версия 1.0 
    (c) 2019 Александр Галков, [email protected]
    .EXAMPLE
    New-Employee
    .LINK
    www.galkov.pro/powershell_script_for_creating_and_removing_users
    #>
  
    [CmdletBinding()]
    Param ()
 
    $logicalRoot = "\\domain.local\dfs\redirected\"
    $physicalRoot = "\\fs.domain.local\redirected\"
 
    #####
    Write-Host "Создаем учетную запись..."
    #####
 
    $refAccountName = Read-Host "`tИмя эталонной учетной записи"
    $refAccount = Get-ADUser -Identity $refAccountName -Properties *
    $newAccountName = Read-Host "`tИмя новой учетной записи"
     
    $plainTextPassword = Get-Random -Minimum 1000 -Maximum 10000
    if ($ent_val = Read-Host ("`tПароль [{0}]" -f $plainTextPassword))
    {
        $plainTextPassword = $ent_val
    }
    $securePasword = ConvertTo-SecureString -AsPlainText $plainTextPassword -Force
     
    $userPrincipalName = $newAccountName + $refAccount.UserPrincipalName.Substring($refAccount.UserPrincipalName.IndexOf('@'),
        $refAccount.UserPrincipalName.Length - $refAccount.UserPrincipalName.IndexOf('@'))
    if ($ent_val = Read-Host ("`tUPN [{0}]" -f $userPrincipalName))
    {
        $userPrincipalName = $ent_val
    }
     
    $OU = $refAccount.DistinguishedName -replace ".*?[^\\],(.*)",'$1'
    if ($ent_val = Read-Host ("`tOU [{0}]" -f $OU))
    {
        $OU = $ent_val
    }    
     
    $lastName = Read-Host "`tФамилия"
    $firstName = Read-Host "`tИмя и отчество"
    $fullName = $lastName + " " + $firstName
    $phone = Read-Host "`tНомер телефона"
    $office = Read-Host "`tНомер кабинета"
     
    $email = $newAccountName + $refAccount.Mail.Substring($refAccount.Mail.IndexOf('@'),
        $refAccount.Mail.Length - $refAccount.Mail.IndexOf('@'))
    if ($ent_val = Read-Host ("`tЭлектронная почта [{0}]" -f $email))
    {
        $email = $ent_val
    }   
     
    New-ADUser -Path $OU -UserPrincipalName $userPrincipalName -SamAccountName $newAccountName `
        -AccountPassword $securePasword -DisplayName $lastName -Surname $lastName -GivenName $firstName `
        -Name $fullName -OfficePhone $phone -Office $office -EmailAddress $email -CannotChangePassword $true `
        -PasswordNeverExpires $true -Enabled $true
    Write-Host "`tПользователь создан"
 
    #####
    Write-Host "Изменяем членство в группах..."
    #####
 
    $groups = Get-ADPrincipalGroupMembership -Identity $refAccountName
    foreach ($group in $groups)
    {
        do
        {
            $flag = Read-Host -Prompt ("`tДобавить пользователя в группу `"{0}`" (y/n)?" -f $group.Name)
            if ($flag -eq "y") 
            {
                Add-ADPrincipalGroupMembership -Identity $newAccountName -MemberOf $group
                Write-Host ("`tПользователь добавлен в группу `"{0}`" " -f $group.Name)
            }
        } while (($flag -ne "y") -and ($flag -ne "n"))
    }
 
    #####
    Write-Host "Создаем корневую папку для перенаправленных папок пользователя..."
    #####
 
    $logicalPath = $logicalRoot + $newAccountName
    if ($ent_val = Read-Host ("`t`"Логический`" путь к перенаправленным папкам [{0}]" -f $logicalPath))
    {
        $logicalPath = $ent_val
    }
     
    $physicalPath = $physicalRoot + $newAccountName
    if ($ent_val = Read-Host ("`t`"Физический`" путь к перенаправленным папкам [{0}]" -f $physicalPath))
    {
        $physicalPath = $ent_val
    }
     
    New-Item -ItemType Directory -Path $physicalPath | Out-Null
    $account = New-Object System.Security.Principal.NTAccount($userPrincipalName)
    $rights = [System.Security.AccessControl.FileSystemRights]"FullControl"
    $inFlags = [System.Security.AccessControl.InheritanceFlags]"ContainerInherit,ObjectInherit"
    $prFlags = [System.Security.AccessControl.PropagationFlags]"None"
    $access =[System.Security.AccessControl.AccessControlType]::Allow
    $ace = New-Object System.Security.AccessControl.FileSystemAccessRule($account, $rights, $inFlags, $prFlags, $access)
    $acl = Get-ACL $physicalPath
    $acl.AddAccessRule($ace)
    Set-ACL $physicalPath $acl
    Write-Host "`tКорневая папка создана"
     
    New-DfsnFolderTarget -Path $logicalPath -TargetPath $physicalPath | Out-Null
    Write-Host "`tСсылка в DFS на корневую папку создана"
 
    #####
    Write-Host "Завершаем выполнение сценария..."
    #####
}

замечание: регулярное выражение, используемое для получения FQDN родительского объекта, извлекает из FQDN эталонной учетной записи все символы, следующие за первой запятой, перед которой нет символа "\". Такое условие позволяет использовать в CN запятые, представляемые сочетанием символов "\,"

function Remove-Employee
{
    <#
    .SYNOPSIS
    Командлет предназначен для удаления пользователя
    .DESCRIPTION
    Командлет удаляет учетную запись, перенаправленные папки 
    пользователя и соответствующую ссылку в DFS
    .INPUTS
    -
    .OUTPUTS
    -    
    .NOTES
    Версия 1.0 
    (c) 2019 Александр Галков, [email protected]
    .EXAMPLE
    Remove-Employee
    .LINK
    www.galkov.pro/powershell_script_for_creating_and_removing_users
    #>
   
    [CmdletBinding()]
    Param ()
  
    $logicalRoot = "\\domain.local\dfs\redirected\"
  
    $accountName = Read-Host "Имя учетной записи"
    $account = Get-ADUser -Identity $accountName
      
    $logicalPath = $logicalRoot + $accountName
    if ($ent_val = Read-Host ("`"Логический`" путь к перенаправленным папкам [{0}]" -f $logicalPath))
    {
        $logicalPath = $ent_val
    }
      
    $physicalPath = (Get-DfsnFolderTarget -Path $logicalPath).TargetPath
    if ($ent_val = Read-Host ("`"физический`" путь к перенаправленным папкам [{0}]" -f $physicalPath))
    {
        $physicalPath = $ent_val
    }
      
    Write-Host "Удаляем ссылку в DFS..."
    Remove-DfsnFolder -Path $logicalPath -Confirm
  
    Write-Host "Удаляем перенаправленные папки..."
    Remove-Item -LiteralPath $physicalPath -Recurse -Force -Confirm
  
    Write-Host "Удаляем учетную запись..."
    Remove-ADUser -Identity $accountName -Confirm
  
    Write-Host "Завершаем выполнение сценария..."
}

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