• PowerShell - Получаем список DNS Conditional Forwarders

    Чтобы быстро получить список форвардеров DNS (Conditional Forwarders) выполним PowerShell код указав в переменной $DNSServerName имя DNS-сервера

    $DNSServer = "DC01"
    $Zones = Get-WMIObject -Computer $DNSServer -Namespace "root\MicrosoftDNS" -Class "MicrosoftDNS_Zone"

    $Zones | Select-Object Name,MasterServers,DsIntegrated,ZoneType | where {$_.ZoneType -eq "4"} | ft -AutoSize

    Множество полезных примеров по работе с DNS через PowerShell можно найти в статье Indented! - Administering Microsoft DNS in PowerShell

  • PowerShell - Получаем список трастов AD

    Получаем список трастов AD с помощью PowerShell для текущего домена:

    $myLocalDomain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()

    $myLocalDomain.GetAllTrustRelationships() | ft -AutoSize

    Тоже самое только если нужно явно указать конкретный домен (указываем в переменной $SpecDomain):

    $SpecDomain = "my.holding.com"

    $myRootDirContext = New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext('domain',$SpecDomain)

    $myRootDomain = [System.DirectoryServices.ActiveDirectory.Domain]::GetDomain([System.DirectoryServices.ActiveDirectory.DirectoryContext]$myRootDirContext)

    $myRootDomain.GetAllTrustRelationships() | ftAutoSize

    Источник информации: organic fertilizer - using powershell to list active directory trusts

  • Exchange 2010 - Ищем почтовые ящики по PrimarySmtpAddress

    В ходе автоматизированных операций массового создания почтовых ящиков может возникнуть ситуация когда Exchange изменяет значение алиаса почтового ящика добавляя в конце цифровое значение. PrimarySmtpAddress при  этом получается например V.Ivanov2@holding.com вместо желаемого V.Ivanov@holding.com. Таким образом Exchange разрешает конфликты между создаваемым ящиком и уже существующим с таким же алиасом.

    Для того чтобы отловить такие ящики можно воспользоваться нехитрым запросом

    Get-Mailbox -ResultSize Unlimited | where {($_.PrimarySmtpAddress -match ".*[0-9]@.*") -AND ($_.Database -like "KOM-AD01-*")}  | Select Name,PrimarySmtpAddress,Database

     

  • SharePoint 2010 - Замена значений типа "Выбор" в элементах списка

    imageСитуация: На сайте SharePoint 2010 создан какой-то Список в котором создан Столбец с типом значения "Выбор". В значение этого Столбца при настройке введено несколько предопределённых позиций, например: "Значение1", "Значение2", "Значение3".

    "Значение1" определено в настройках как значение по умолчанию.

    После создания и настройки Столбца в Списке создано определённое количество элементов, в которых произведён выбор соответствующих значений.

    Со временем возникает ситуация, когда какое-то значение нужно заменить на новое, например "Значение1" заменить в настройках Списка на "Значение-А".

    Проблема: При внесении изменений в настройки Списка, существующие элементы списка остаются неизменными.

    Читать далее...

  • PowerShell - Резервное копирование групповых политик Active Directory (GPO)

    PowerShell GPO backup scriptОперацию резервного копирования доменных объектов групповых политик (GPO) можно выполнить штатным способом с помощью консоли Group Policy Management (gpmc.msc), но если нам потребуется автоматизировать данный процесс, - можно использовать командлеты модуля GroupPolicy для PowerShell 2.0

    Читать далее...

  • Windows Server 2008 R2 - Корзина Active Directory

    Active Directory Recycle BinПриведу маленькую шпаргалку по использованию корзины AD (Active Directory Recycle Bin) в домене Windows Server 2008 R2.

    Читать далее...

  • Exchange 2010– Делегирование Send As

    imageПри необходимости делегирования прав на управление почтовыми ящиками в Exchange 2010 можно столкнуться с ситуацией, когда при создании группы ролей путём копирования из преднастроенной группы "Recipient Management" будет создана группа ролей, которая не дает права предоставления разрешения отправки от  имени (Send As). Чтобы добавить это право к созданной группе ролей нужно добавить роль "Active Directory Permissions". Для уже существующей группы ролей это можно выполнить с помощью PS команды:

    New-ManagementRoleAssignment -SecurityGroup "My Recipient Management" -Role "Active Directory Permissions"


    Если же группа ролей которая будет кастомизирована ещё не создана то вот пример для создания группы путём копирования из преднастроенной с добавлением соответствующей роли:

    $RGbyDefault = Get-RoleGroup "Recipient Management"

    New-RoleGroup "My Recipient Management" -Roles $RGbyDefault.roles

    Set-RoleGroup "My Recipient Management" -ManagedBy $RGbyDefault.ManagedBy

    New-ManagementRoleAssignment -SecurityGroup "My Recipient Management" -Role "Active Directory Permissions"


    Так же добавление роли к группе ролей можно выполнить через веб-интерфейс Exchange ECP

    image

  • PowerShell - Аудит использования учетных записей

    imageПродолжая тему анализа доменных учетных записей пользователей и компьютеров, которые давно не проходили авторизацию в домене предлагаю ещё один вариант скрипта из заметки PowerShell – Поиск неиспользуемых учетных записей пользователей и компьютеров в домене. В текущем варианте используется библиотека AD для PowerShell 2.0

    В указанном примере в конкретном OU выбираются все действующие учетные записи пользователей и компьютеров и выполняется сравнение даты последней авторизации (LastLogonDate) с максимально возможным значением (текущая дата минус 90 дней)

    Import-Module ActiveDirectory
    $SearchOU = "OU=Domain Users and Computers,DC=mydom,DC=com"
    $DaysLimit = 90
    $OldestDate = (Get-Date).AddDays(-$DaysLimit)
    #
    $Users = Get-ADUser -Filter {(Enabled -eq $True)} `
    -SearchBase $SearchOU -Properties SamAccountName,LastLogonDate,CN
    $UsersOld = $Users | Where-Object {$_.LastLogonDate -le $OldestDate}
    $UsersOld | Select `
    @{label="SamAccountName";expression={$_.SamAccountName}},`
    @{label="Last Logon";expression={$_.LastLogonDate}},`
    @{label="User Full Name";expression={$_.CN}}`
    | Sort -Property "Last Logon" | Format-Table  –AutoSize
    Write-Host "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
    write-host "Total users in OU: " $Users.Count " / Unused users: " $UsersOld.Count
    Write-Host "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
    #
    $Comps = Get-ADComputer -Filter {(Enabled -eq $True)} `
    -SearchBase $SearchOU -Properties Name,LastLogonDate,Description
    $CompsOld = $Comps | Where-Object {$_.LastLogonDate -le $OldestDate}
    $CompsOld | Select `
    @{label="PC Name";expression={$_.Name}},`
    @{label="Last Logon";expression={$_.LastLogonDate}},`
    @{label="Description";expression={$_.Description}}`
    | Sort -Property "Last Logon" | Format-Table  –AutoSize
    Write-Host "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
    write-host "Total computers in OU: " $Comps.Count " / Unused computers: " $CompsOld.Count
    Write-Host "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"

  • PowerShell - Аудит использования парольной политики

    imageПродолжая тему анализа доменных учетных записей пользователей на предмет их соответствия действующей парольной политике предлагаю ещё один вариант скрипта из заметки  PowerShell – Поиск пользователей домена с устаревшими паролями. В текущем варианте используется библиотека AD для PowerShell 2.0

    В указанном примере в конкретном OU выбираются все действующие учетные записи пользователей, за исключением сервисных, для которых значение атрибута SamAccountName начинается с символов “s-” и выполняется сравнение даты последней смены пароля с максимально возможным значением (текущая дата минус 185 дней)

    Import-Module ActiveDirectory
    
    $SearchOU = "OU=Domain Users,DC=mydom,DC=com"
    $PWAgeDaysLimit = 185
    
    $Users = Get-ADUser -Filter {(Enabled -eq $True) -AND (SamAccountName -notlike "s-*")} `
    -SearchBase $SearchOU `
    -Properties CN, SamAccountName, PasswordLastSet, PasswordNeverExpires, CannotChangePassword, LastLogonDate
    
     
    $OldestDate = (Get-Date).AddDays(-$PWAgeDaysLimit)
    $UsersOldPWD = $Users | Where-Object {$_.PasswordLastSet -le $OldestDate}
    $UsersOldPWD | Select `
    @{label="User Full Name";expression={$_.CN}},`
    @{label="SamAccountName";expression={$_.SamAccountName}},`
    @{label="PWD Last Set";expression={$_.PasswordLastSet}},`
    @{label="PWD Never Expirest";expression={$_.PasswordNeverExpires}},`
    @{label="PWD Cannot Change";expression={$_.CannotChangePassword}},`
    @{label="Last Logon";expression={$_.LastLogonDate}}`
    | Sort -Property "PWD Last Set"`
    | Format-Table  –AutoSize 
    Write-Host "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
    write-host "Total user accounts in OU: " $Users.Count
    write-host "Users with passwords not changed in" $PWAgeDaysLimit "days: " $UsersOldPWD.Count
    Write-Host "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
  • Exchange 2010 - Использование Shared Mailbox в Outlook 2010

    Shared Mailbox in Outlook 2010Технология общих почтовых ящиков (Shared mailboxes) в Exchange далеко не нова и, насколько я понимаю, на сегодняшний день считается даже морально устаревшей. Ведь не зря в Exchange 2010 в пользовательский интерфейс консоли управления до сих пор не включена возможность даже создания такого рода ящиков и сделать это можно только с помощью PowerShell. Не смотря на то, что в статье TechNet Library - Understanding Mailbox - Understanding Recipients сказано, что вместо общих ящиков рекомендуется использовать ресурсные ящики (Resource mailboxes) или механизмы совместной работы на SharePoint Server, иногда могут встретиться ситуации, в которых использование общих почтовых ящиков является более удобным вариантом.

    Рассмотрим основные моменты управления общими почтовыми ящиками и ряд проблем, с которыми можно столкнуться при их использовании на практике. Сразу отмечу, что речь пойдёт об использовании общих почтовых ящиков на связке Exchange 2010 SP2 и Outlook 2010 SP1. Читать далее...