PDA

Показать полную графическую версию : Администрирование AD


milligan
14-11-2014, 09:52
Решил пользоваться PowerShell вместо mmc ADUC (Нафига? ну просто.... привыкать к PoSH).

Например просто найти пользователя, если точно не знаешь ни фамилии ни логина в ADUC ты забиваешь часть букв фамилии или тогоже логина и тебе вываливается список - где то 3 клика мыши + написать несколько букв.
В PoSH я рисую вот так:

Get-ADUser -Filter 'Name -like "*Петров*"' | FT name, samaccountname - это если ищу по фамилии
Get-ADUser -Filter 'samaccountname -like "*pet*"' | FT name, samaccountname - если ищу по логину
Как обьединить два фильтра?
-------------------------------------------------
Тему буду добавлять вопросами. Надеюсь кому-то тоже будет полезно.

Kazun
14-11-2014, 09:55
Get-ADUser -Filter 'samaccountname -like "*pet*" -or Name -like "*Петров*"'

или

Get-ADUser -Filter 'samaccountname -like "*pet*" -and Name -like "*Петров*"'

milligan
14-11-2014, 10:28
function Get-User ($a)
{
Get-ADUser -Filter 'samaccountname -like "*$a*" -or Name -like "*$a*"' | FT name, samaccountname
}

Ничего не выдает((

Kazun
14-11-2014, 10:32
function Get-User ($a)
{
Get-ADUser -Filter "samaccountname -like '*$a*' -or Name -like '*$a*'" | FT name, samaccountname
}

milligan
14-11-2014, 11:14
Как найти всех членов определенного OU(Organizational Unit)?



PS C:\Windows\system32> Get-ADUser -Properties * -Filter "CanonicalName -like '*IT*'"
Get-ADUser : A Filter was passed that uses constructed attributes
At line:1 char:1
+ Get-ADUser -Properties * -Filter "CanonicalName -like '*IT*'"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-ADUser], ADException
+ FullyQualifiedErrorId : ActiveDirectoryServer:8555,Microsoft.ActiveDirectory.Management.Commands.GetADUser

-----------------
Get-ADUser -Properties * -Filter 'DistinguishedName -like "*IT*"' - не выдает ничего

Kazun
14-11-2014, 11:19
Get-ADUser -Filter * -SearchBase "OU=IT,DC=Contoso,DC=Com"

milligan
14-11-2014, 12:14
function Get-User{
param (
[string]$User,
[string]$OU
)
if ($OU) {Get-ADUser -Filter * -SearchBase "OU=$OU,DC=contoso,DC=com" | ft name, samaccountname, officephone}
if ($User) { Get-ADUser -Filter "samaccountname -like '*$User*' -or Name -like '*$User*'" -Properties * | FT name, samaccountname, officephone }

}

Возможно ли задавать OU не точно, а только часть букв?

Kazun
14-11-2014, 12:29
Get-ADOrganizationalUnit -Filter "Name -like '*$OU*'" | Foreach {
Get-ADUser -Filter * -SearchBase $_
}

milligan
17-11-2014, 12:37
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) - при следующем логине все конектится штатно

Kazun
17-11-2014, 12:59
В конце блока, попробовать использовать Set-ADUser:
Set-ADUser $samAccountName -HomeDirectory $userDir -HomeDrive "H:"

milligan
17-11-2014, 13:10
Работает) СПС.
Видимо папка должна создаваться до того, как будет прописана у пользователя




© OSzone.net 2001-2012