Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Администрирование AD

Ответить
Настройки темы
PowerShell - Администрирование AD

Новый участник


Сообщения: 48
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

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

Отправлено: 09:52, 14-11-2014

 

Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
Get-ADUser -Filter 'samaccountname -like "*pet*" -or Name -like "*Петров*"'
или

Код: Выделить весь код
Get-ADUser -Filter 'samaccountname -like "*pet*" -and Name -like "*Петров*"'
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:55, 14-11-2014 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 48
Благодарности: 0

Профиль | Отправить PM | Цитировать


function Get-User ($a)
{
Get-ADUser -Filter 'samaccountname -like "*$a*" -or Name -like "*$a*"' | FT name, samaccountname
}

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

Отправлено: 10:28, 14-11-2014 | #3


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
function Get-User ($a)
 {
 Get-ADUser -Filter "samaccountname -like '*$a*' -or Name -like '*$a*'" | FT name, samaccountname
 }
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:32, 14-11-2014 | #4


Новый участник


Сообщения: 48
Благодарности: 0

Профиль | Отправить PM | Цитировать


Как найти всех членов определенного 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*"' - не выдает ничего

Отправлено: 11:14, 14-11-2014 | #5


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
Get-ADUser -Filter * -SearchBase "OU=IT,DC=Contoso,DC=Com"
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:19, 14-11-2014 | #6


Новый участник


Сообщения: 48
Благодарности: 0

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
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 не точно, а только часть букв?

Отправлено: 12:14, 14-11-2014 | #7


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
Get-ADOrganizationalUnit -Filter "Name -like '*$OU*'" | Foreach {
	Get-ADUser -Filter * -SearchBase $_
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:29, 14-11-2014 | #8


Новый участник


Сообщения: 48
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: jpg 2014_11_17_14_35_18_Active_Directory_Users_and_Computers.jpg
(41.6 Kb, 5 просмотров)
Тип файла: jpg 2014_11_17_14_36_31_Program_Manager.jpg
(67.2 Kb, 5 просмотров)

Код: Выделить весь код
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) - при следующем логине все конектится штатно

Последний раз редактировалось milligan, 17-11-2014 в 13:12. Причина: 1


Отправлено: 12:37, 17-11-2014 | #9


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


В конце блока, попробовать использовать Set-ADUser:
Код: Выделить весь код
Set-ADUser $samAccountName -HomeDirectory $userDir -HomeDrive "H:"
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:59, 17-11-2014 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Администрирование AD

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Администрирование ModeJunior Хочу все знать 1 01-04-2013 12:06
Администрирование с недоменного ПК (AD,DNS,DHCP,...) zubkoff.s Microsoft Windows NT/2000/2003 11 10-02-2011 14:30
Переход с AD 2000 Enterprice на AD 2003 standart seniora Microsoft Windows NT/2000/2003 2 20-08-2007 14:09
Удаленное администрирование Zaza Сетевые технологии 6 10-04-2005 18:46




 
Переход