Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Администрирование AD (http://forum.oszone.net/showthread.php?t=290950)

milligan 14-11-2014 09:52 2429340

Администрирование AD
 
Решил пользоваться 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 2429342

Код:

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

Код:

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

milligan 14-11-2014 10:28 2429349

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

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

Kazun 14-11-2014 10:32 2429352

Код:

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


milligan 14-11-2014 11:14 2429365

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

Код:

Get-ADUser -Filter * -SearchBase "OU=IT,DC=Contoso,DC=Com"

milligan 14-11-2014 12:14 2429394

Код:

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 2429397

Код:

Get-ADOrganizationalUnit -Filter "Name -like '*$OU*'" | Foreach {
        Get-ADUser -Filter * -SearchBase $_
}


milligan 17-11-2014 12:37 2430690

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

Kazun 17-11-2014 12:59 2430704

В конце блока, попробовать использовать Set-ADUser:
Код:

Set-ADUser $samAccountName -HomeDirectory $userDir -HomeDrive "H:"

milligan 17-11-2014 13:10 2430712

Работает) СПС.
Видимо папка должна создаваться до того, как будет прописана у пользователя


Время: 22:32.

Время: 22:32.
© OSzone.net 2001-