Вложений: 2
Код:
Function Global:New-ADUserExtended ([parameter(Mandatory=$true)][string]$samAccountName,
[parameter(Mandatory=$true)][string]$Name,
# [parameter(Mandatory=$true)][string]$SecondName,
[parameter(Mandatory=$true)][string]$Surname,
[parameter(Mandatory=$true)][string]$ColleagueSamAccountName,
[parameter(Mandatory=$false)][string]$Office,
[parameter(Mandatory=$false)][string]$TelephoneNumber,
# [parameter(Mandatory=$false)][string]$IPphone,
# [parameter(Mandatory=$false)][string]$MobilePhone,
# [parameter(Mandatory=$false)][string]$Street,
# [parameter(Mandatory=$true)][string]$JobTitle,
# [parameter(Mandatory=$false)][string]$Departament,
# [parameter(Mandatory=$false)][string]$Company,
[parameter(Mandatory=$false)][string]$Description,
# [parameter(Mandatory=$false)][string]$Email,
# [parameter(Mandatory=$false)][datetime]$ExpireAccount,
[parameter(Mandatory=$false)][switch]$AddToColleagueGroups,
[parameter(Mandatory=$true)][string]$AccountPassword,
[parameter(Mandatory=$false)]$Server,
[parameter(Mandatory=$false)]$Credential) {
Write-Host
$error.Clear | Out-Null
Write-Host 'Original and comments: http://vam.in.ua/index.php/it/25-ms-powershell/154-powershell-ad-account-create.html'
Write-Host 'Feedback: http://vam.in.ua/index.php/contacts/2-admins/1-aleksey.html'
$passwd=''
Remove-Variable commonError,passwd,colleague -ErrorAction SilentlyContinue
Write-Host
#--- Импортируем модуль AD
Import-Module -Name ActiveDirectory -ErrorVariable commonError
# Выделяем односимвольный инициал
#$Initial = $SecondName.Substring(0,1).ToUpper()
# Собираем полное имя
$displayName = $Name + ' ' + $Surname
# Добавляем несокращенные ФИО к описанию
#$Description += &{' [' + $Name + ' ' + $SecondName + ' ' + $Surname + ']'}
Write-Host 'Sam Account Name/User Principal Name/Login: ('$samAccountName.Length") `t" $samAccountName -ForegroundColor Yellow
Write-Host 'Full Name: ('$displayName.Length") `t`t`t`t`t" $displayName
Write-Host 'Description: ('$Description.Length") `t`t`t`t" $Description -ForegroundColor Yellow
Write-Host 'Street: ('$Street.Length") `t`t`t`t`t" $Street
Write-Host 'Telephone: ('$TelephoneNumber.Length") `t`t`t`t`t" $TelephoneNumber -ForegroundColor Yellow
Write-Host 'IP Phone: ('$IPphone.Length") `t`t`t`t`t" $IPphone
Write-Host 'Mobile Phone: ('$MobilePhone.Length") `t`t`t`t" $MobilePhone -ForegroundColor Yellow
Write-Host 'Company: ('$Company.Length") `t`t`t`t`t" $Company
Write-Host 'Departament: ('$Departament.Length") `t`t`t`t`t" $Departament -ForegroundColor Yellow
Write-Host 'Office: ('$Office.Length") `t`t`t`t`t" $Office
Write-Host 'Job Title: ('$JobTitle.Length") `t`t`t`t`t" $JobTitle -ForegroundColor Yellow
Write-Host 'E-Mail: ('$Email.Length") `t`t`t`t`t" $Email
Write-Host "Account will expire: `t`t`t`t" $ExpireAccount -ForegroundColor Yellow
Write-Host "Account password: `t`t`t`t`t" $AccountPassword
Write-Host "Collegue: `t`t`t`t`t`t" $ColleagueSamAccountName -ForegroundColor Yellow
Write-Host
while (($ContinOk.Length -ne 1) -or ($ContinOk -inotmatch {[yn]})) {
$mess = 'Создать такую учетную запись? (Y/N)'
$ContinOk = Read-Host -Prompt $mess
}
if ($ContinOk -ieq "N") {
Remove-Variable ContinOk -ErrorAction SilentlyContinue
Write-Error -Message "Операция была отменена" -ErrorAction Stop
} else {
#--- Если указаны учетные данные
if ($Credential) {
$passwd = Get-Credential -Credential $Credential -ErrorVariable commonError
if ((!$passwd) -or ($passwd.Length -lt 1)) {Break}
}
#--- Если переменная Server не определена, то подставить ей значение текущего контроллера домена
if ($Server) {
if ($Credential) {
$Server = Get-ADDomainController -Credential $passwd -Server $Server -ErrorVariable commonError
$Domain = $Server.Domain
$Server = $Server.HostName
} else {
$Server = Get-ADDomainController -Server $Server -ErrorVariable commonError
$Domain = $Server.Domain
$Server = $Server.HostName
}
} else {
if ($Credential) {
$Server = Get-ADDomainController -Credential $passwd -ErrorVariable commonError
$Domain = $Server.Domain
$Server = $Server.HostName
} else {
$Server = Get-ADDomainController -ErrorVariable commonError
$Domain = $Server.Domain
$Server = $Server.HostName
}
}
# Если произошла общая ошибка - прервать функцию
if ($commonError) {
Remove-Variable passwd,Credential -ErrorAction SilentlyContinue
Break
}
# Узнаем где находится учетная запись коллеги
if ($Credential) {
$colleague = Get-ADUser -Identity $ColleagueSamAccountName -Server $Server -Credential $passwd -ErrorVariable commonError
} else {
$colleague = Get-ADUser -Identity $ColleagueSamAccountName -Server $Server -ErrorVariable commonError
}
$colleague = $colleague.DistinguishedName | Out-String
$colleague = $colleague | where {$_ -match ",(.+)"} | foreach {$Matches[1]}
# Если произошла общая ошибка - прервать функцию
if ($commonError) {
Remove-Variable passwd,Credential -ErrorAction SilentlyContinue
Break
}
# Если не определено время просроченности аккаунта - то устанавливаем его в Never
if ((!$ExpireAccount) -or ($ExpireAccount.Length -lt 1)) {
$ExpireAccount = "1/1/1970"
}
# Если определен сервер и для коллеги есть хоть один символ - создать аккаунт AD
if (($Server) -and ($colleague.Length -gt 0)) {
# Формируем командлет New-ADUser в зависимости от наличия параметров
[string]$comandLet = 'New-ADUser -SamAccountName $samAccountName -Name $displayName `
-DisplayName $displayName -Surname $Surname `
-ErrorVariable commonError -ErrorAction Stop `
-AccountPassword (ConvertTo-SecureString -String $AccountPassword -AsPlainText -Force) `
-Path $colleague -Server $Server `
-CannotChangePassword $true `
-homedrive "H" -homedirectory "\\Srvshare\home\$samAccountName" `
-PasswordNeverExpires $true '
# Создаем массив переменных (параметр командлета New-ADUser, пробел, переменная; о одинарных кавычках, через запятую)
$cmltParameters = ('-Office $Office','-OfficePhone $TelephoneNumber','-StreetAddress $Street',`
'-Title $JobTitle','-Department $Departament','-Company $Company',`
'-Description $Description','-EmailAddress $Email','-MobilePhone $MobilePhone',`
'-AccountExpirationDate $ExpireAccount','-Credential $passwd')
# Если длина параметра не ноль, добавляем его в командлет New-ADUser
foreach ($parameter in $cmltParameters) {
[string]$expression = 'if (' + ([regex]::Match($parameter,'(?<=\s)(\$.+)')) + '.Length -ge 1) {$comandLet += " $parameter"}'
Invoke-Expression $expression
}
$userPrincipalName = $samAccountName + '@' + $Domain
# Добавляем в командлет New-ADUser дополнительные статические атрибуты
$comandLet += ' -OtherAttributes @{userPrincipalName=$userPrincipalName;givenName=$Name;countryCode="804";co="Ukraine";c="UA";l="Kharkov"'
# Создаем массив дополнительных динамических атрибутов (параметр равно переменная; в одинарных кавычках, через запятую)
$cmltParametersAdditional = ('ipPhone=$IPphone')
# Если длина дополнительного атрибута не ноль, добавляем его в командлет New-ADUser
foreach ($additionalParameter in $cmltParametersAdditional) {
[string]$expression = 'if (' + ([regex]::Match($additionalParameter,'(?<=\=)(\$.+)')) + '.Length -ge 1) {$comandLet += ";$additionalParameter"}'
Invoke-Expression $expression
}
# Закрываем скобку перечисления дополнительных атрибутов -OtherAttributes в командлете New-ADUser
$comandLet += '}'
# Командлет New-ADUser собран, выполняем его
Invoke-Expression $comandLet
# Если нет ошибок - выполнить блок кода
if ((!$commonError) -and (!$commonWarn)) {
# Активируем новый аккаунт
if ($Credential) {
Set-ADUser -Identity $samAccountName -ChangePasswordAtLogon $true -Server $Server -Credential $passwd
Enable-ADAccount -Identity $samAccountName -Server $Server -Credential $passwd
} else {
Set-ADUser -Identity $samAccountName -ChangePasswordAtLogon $false -Server $Server
Enable-ADAccount -Identity $samAccountName -Server $Server
}
# Поздравим с успешным созданием
$mess = 'Новая учетная запись "' + $samAccountName + '" успешно создана на сервере "' + $Server + '" в ' + $colleague
Write-Host $mess
# Если указан параметр добавления нового аккаунта в группы коллеги, выполняем блок кода
if ($AddToColleagueGroups.IsPresent) {
if ($Credential) {
# Узнаем в каких группах состоит коллега
$grps = Get-ADUser -Identity $ColleagueSamAccountName -Properties MemberOf -Server $Server -Credential $passwd -ErrorVariable commonError
} else {
$grps = Get-ADUser -Identity $ColleagueSamAccountName -Properties MemberOf -Server $Server -ErrorVariable commonError
}
# Выделяем группы коллеги в переменную
$grps = $grps.MemberOf
if ($grps.Length -ge 1) {
# Объявляем строковую переменную, в которую будем через запятую заносить имена групп для вывода на экран
[string]$strgrp = ''
# Добавляем созданный нами аккаунт в те же группы, что и у коллеги
foreach ($grp in $grps) {
if ($Credential) {
Add-ADGroupMember -Identity $grp -Members $samAccountName -Server $Server -Credential $passwd -ErrorVariable commonError
} else {
Add-ADGroupMember -Identity $grp -Members $samAccountName -Server $Server -ErrorVariable commonError
}
# Регулярное выражение, которое выделит название группы в удобочитаемом виде
$strgrp = $strgrp + [regex]::Match($grp,'(?<=\=).*?(?=\,)') + ', '
}
# Поздравим с успешным добавлением в группы к коллеге
if (!$commonError) {
# Удаляем из строчного списка групп последнюю запятую
$strgrp = $strgrp.Substring(0,($strgrp.Length -2))
# Формируем сообщение со списком групп
$mess = 'Новая учетная запись успешно добавлена в группы: ' + $strgrp
Write-Host $mess
}
}
}
}
}
}
$passwd=''
<#
mkdir \\Srvshare\home\$samAccountName
$ACL = Get-ACL \\Srvshare\home\$samAccountName
$Setting = "DOMEN\$samAccountName","FullControl","Allow"
$AccessRule = new-object System.Security.AccessControl.FileSystemAccessRule $Setting
$ACL.SetAccessRule($AccessRule)
$ACL | Set-Acl \\Srvshare\home\$samAccountName
#>
if ( !(Test-Path -Path "\\srvshare\HOME\$samAccountName" -PathType Container) ) {
## Doesn't exist so create it.
Write-Host "home directory doesn't exist. Creating home directory."
## Create the directory
New-Item -path \\srvshare\HOME\ -Name $samAccountName -ItemType Directory
$userDir = "\\srvshare\HOME\$samAccountName"
## Modify Permissions on homedir
$Rights= [System.Security.AccessControl.FileSystemRights]::Read -bor [System.Security.AccessControl.FileSystemRights]::Write -bor [System.Security.AccessControl.FileSystemRights]::Modify -bor [System.Security.AccessControl.FileSystemRights]::FullControl
$Inherit=[System.Security.AccessControl.InheritanceFlags]::ContainerInherit -bor [System.Security.AccessControl.InheritanceFlags]::ObjectInherit
$Propogation=[System.Security.AccessControl.PropagationFlags]::None
$Access=[System.Security.AccessControl.AccessControlType]::Allow
$AccessRule = new-object System.Security.AccessControl.FileSystemAccessRule("DOMEN\$samAccountName",$Rights,$Inherit,$Propogation,$Access)
$ACL = Get-Acl \\srvshare\HOME\$samAccountName
$ACL.AddAccessRule($AccessRule)
$Account = new-object system.security.principal.ntaccount("DOMEN\$samAccountName")
$ACL.setowner($Account)
$ACL.SetAccessRule($AccessRule)
Set-Acl $userDir $ACL
}
Remove-Variable passwd,Credential,mess,strgrp,grp,grps,colleague,AccountPassword,Domain -ErrorAction SilentlyContinue
}
Скрипт на создание пользователя, вопрос по последнему куску (Выделено жирным).
Домашняя директория создается и права раздаются - но при входе пользователя не монтируется
Если зайти в ADUC что-то изменить (не связанное с HOME Folder) - при следующем логине все конектится штатно
|