Управление объектом групповой политики windows active directory с помощью power shell

In this tutorial, we’ll look at how to add a server to an Active Directory domain using PowerShell.

As we’ve already mentioned in previous articles on this blog, PowerShell can really save a lot of time when adding and configuring servers, client devices, services and applications. It can also be used to make scripts so that you can automate repetitive tasks.

As a result, we’re going to show you how to add a machine to a domain using PowerShell. We’ll also look at how to change its name on the domain too. So, you’re getting two for the price of one!

В скриптах PowerShell, в которых у пользователя запрашиваются его имя и пароль, прежде чем приступать к выполнению действий иногда нужно сначала протестировать валидность введенных учетных данных. Если пользователь ввел неверные имя пользователя и пароль, нужно определить это и запросить их еще раз.

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

PowerShell скрипт для тестирования пароля пользования в домене

тестирование пароля учетной записи из скрипта PowerShell

Если скрипт вернул False, возможные причины:

  • Неверное имя пользователя (проверьте, что пользователь существует) или пароль
  • Учетная запись пользователя в AD отключена или временно заблокирована
  • Домен недоступен

Этот PowerShell скрипт не использует PowerShell модуль для Active Directory из набора RSAT и его можно использовать для тестирования учетных данных пользователя с любого Windows компьютера.

Если нужно подключиться к контроллеру домена с компьютера в рабочей группе или другого домена, нужно указать LDAP строку для подключения к DC. Замените 4 строку на:

Или можно подключиться к контроллеру домена по IP адресу:

Инструкции

Ниже приведены инструкции по использованию Windows PowerShell для управления объектами групповой политики Windows Active Directory.

  1. В приведенном ниже примере команды возвращаются все объектов групповой политики, найденные в указанном домене:
Get-GPO -All -Domain “TSDOMAIN.local”

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

  1. Get-GPO можно использовать для возврата общей информации для определенного объекта групповой политики.  В примере ниже приведена общая информация для объекта групповой политики «Team_WP».
Get-GPO -Name Team_WP

Get-GPO можно использовать для возврата общей информации для определенного объекта групповой политики.

  1. Информацию о объекте групповой политики можно вернуть, запросив идентификатор GUID объекта групповой политики. команда ниже приведена в качестве примера:
Get-GPO -Guid cb6fe78f-8b4f-4a77-9320-6a087a9d2bcc -Domain “TSDOMAIN.local”

Информацию о объекте групповой политики можно вернуть, запросив идентификатор GUID объекта групповой политики

  1. Команда Get-GPOReport ниже возвращает комплексный отчет для всех объектов групповой политики домена, компиляляя информацию в формате HTML для просмотра.
Get-GPOReport -All -Domain “TSDOMAIN.Local” -ReportType HTML -Path “C:\GPOReports\GPOReportsAll.html”

Команда Get-GPOReport ниже возвращает комплексный отчет для всех объектов групповой политики домена.

  1. После запуска Get-GPOReport файл HTML создается по пути к файлу, указанному в команде выше.

ФАЙЛ HTML создается по пути к файлу

  1. Открываемые файлы будут отображаться как страница браузера со подробными сведениями о всех найденных объектов групповой политики домена.

После открытия файл станет страницей браузера со подробными сведениями о всех найденных объектов групповой политики домена.

Дополнительная информация

Для контроля хода репликации объектов AD можно использовать средства PowerShell из модуля Active Directory.

Для начала, импортируем модуль:

Import-Module ActiveDirectory

Для выведения полного списка командлетов, связанных с работой по репликации AD можно выполнить:

get-command -module activedirectory -name *ADReplicat*

В случае, если нужно вывести список ошибок репликации на контроллере(или контроллерах) домена, можно воспользоваться командлетом

Get-ADReplicationFailure -Target DC1,DC2

, где DC1,DC2 – имена домен-контроллеров.

Также можно запросить статус репликации для всех контроллеров домена в составе сайта:

Get-ADReplicationFailure -scope site -target {SITE} | FT Server, LastError, Partner-Auto

Тоже самое, но для отдельного домена:

Get-ADReplicationFailure -Target "domen.com" -Scope Domain

Предположим, выявили проблемы с репликацией конкретного объекта AD. В этом случае можно попробовать принудительно инициировать его репликацию с помощью командлета Sync-ADObject.

​​​​​​​Get-ADDomainController -filter * | foreach {Sync-ADObject -Object "cn=Vasya Pupkin ,cn=Users,dc=domen,dc=com" -source DC1 -Destination $_.hostname}

Еще несколько полезных командлетов.

Get-ADReplicationPartnerMetadata ​​​​​​​позволяет получить информацию о метаданных репликации между DC и его партнерами, в частности время последней попытки выполнить репликацию и время последней успешной репликации( для этого нужно выбрать данные, которые мы хотим получить (Select-Object Server, LastReplicationAttempt, LastReplicationSuccess, Partner)

С помощью командлета Get-ADReplicationQueueOperation можно получить список операций ожидающих репликации на сервере.

Командлет Get-ADReplicationConnection позволяет вывести информацию о партнерах репликации для текущего контролера домена. Например, если мы хотим узнать эту информацию для конкретного домен-контроллера, можно выполнить:

Get-ADReplicationConnection -Filter {ReplicateToDirectoryServer -eq "DC1"}

Командлет Get-ADReplicationUpToDatenessVectorTable выдает список USN для партнеров по репликации:

Get-ADReplicationUpToDatenessVectorTable * | ft Partner,Server,UsnFilter

Не секрет, что начиная с первой версии PowerShell, Microsoft пытается сделать из него основной инструмент администрирования Windows. И во многом это получается! Сегодня на простых примерах, мы покажем возможности PowerShell, которые можно использовать для получения различной информации о пользователях Active Directory и их атрибутах.

Примечание. Ранее для получения информации об атрибутах учетных записей пользователей AD приходилось использовать различные инструменты: консоль ADUC (в том числе сохраненные запросы AD), vbs скрипты, утилиту dsquery и т.п. Выбор инструмента обычно основывался на поставленной задачи и способностях администратора в программировании.

Запускаем окно Powershll с правами администратора и импортируем модуль Active Directory командой:

Import-Module activedirectory

Совет. В Windows Server 2012 и выше этот пункт можно пропустить, так как модуль PowerShell Active Directory подключен по-умолчанию.

RSAT включить модуль Active Directory Module for Windows PowerShell

help Get-ADUser

Чтобы вывести список всех учетных записей домена, выполним команду:

Get-ADUser -filter *

Важно. Не рекомендуется выполнять эту команду в доменах с большим количеством аккаунтов, т.к. возможно перегрузка контроллера домена, предоставляющего данные.

:/>  Убрать галочки на файлах в windows 7

Get-ADUser -filter * - вывести список всех пользователей в ADФормат возвращаемого списка не очень удобен для использования, выводится только некоторые основные 10 из более 120 атрибутов и свойств учетных записей пользователей (DN, SamAccountName, Name, SID, UPN и т.д) кроме того, мы видим, что информация о времени последней смены пароля отсутствует.

Get-ADUser -identity tuser -properties *
  • PasswordExpired
  • PasswordLastSet
  • PasswordNeverExpires
Get-ADUser tuser -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires

Get-ADUse - время смены и истечения срока действия пароля в ADТеперь в данных пользователя есть информация о дате смены пароля и времени, когда срок пароля истечет. Представим информацию в более удобном табличном виде:

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires

Get-ADUser - табличное преставление о свойствах пользователейЧтобы вывести данные пользователей из определенной OU, воспользуемся параметром SearchBase:

Get-ADUser -SearchBase ‘OU=Moscow,DC=winitpro,DC=loc’ -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires

Результат выполнения команды можно выгрузить в текстовый файл:

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires > C:\temp\users.txt

Или в CSV, который в дальнейшем будет удобно экспортировать в Excel (дополнительно с помощью sort-object отсортируем таблицу по столбцу PasswordLastSet , а также добавим условие where – имя пользователя должно содержать строку «Dmitry»):

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | where {$_.name –like “*Dmitry*”} | sort-object PasswordLastSet | select-object Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires | Export-csv -path c:\temp\user-password-expires-2015.csv

Get-ADUser с условием where и сохранением в csv

Таким образом, можно построить таблицу с любыми необходимыми атрибутами пользователей Active Directory.

Совет.  Для получения данных о компьютерах Active Directory используется командлет Get-ADComputer.

Далее приведем еще несколько полезных вариантов запросов о пользователях Active Directory с помощью различных фильтров. Вы можете их комбинировать для получения необходимого списка пользователей AD:

Вывод пользователей AD, имя которых начинается с Roman:

Get-ADUser -filter {name -like "Roman*"}

Чтобы подсчитать общее количество всех аккаунтов в Active Directory:

Get-ADUser -Filter {SamAccountName -like "*"} | Measure-Object

Список всех активных (не заблокированных) учетных записей в AD:

Get-ADUser -Filter {Enabled -eq "True"} | Select-Object SamAccountName,Name,Surname,GivenName | Format-Table

Список учетных записей с истекшим сроком действия пароля:

Get-ADUser -filter {Enabled -eq $True} -properties passwordExpired | where {$_.PasswordExpired}

Список активных учеток с почтовыми адресами:

Get-ADUser -Filter {(mail -ne "null") -and (Enabled -eq "true")} -Properties Surname,GivenName,mail | Select-Object Name,Surname,GivenName,mail | Format-Table

Задача: для списка учетных записей, которые хранятся в текстовом файле (по одной учетке в строке) нужно получить телефон пользователя в AD и выгрузить информацию в текстовый csv файл (можно легко импортировать в Esxel).

Import-Csv c:\ps\usernsme_list.csv | ForEach {
Get-ADUser -identity $_.user -Properties Name, telephoneNumber |
Select Name, telephoneNumber |
Export-CSV c:\ps\export_ad_list.csv -Append -Encoding UTF8
}

Следующий пример позволяет выгрузить адресную книгу предприятия в виде csv файла, который в дальнейшем можно импортировать в Outlook или Mozilla Thunderbird:

Get-ADUser -Filter {(mail -ne "null") -and (Enabled -eq "true")} -Properties Surname,GivenName,mail | Select-Object Name,Surname,GivenName,mail | Export-Csv -NoTypeInformation -Encoding utf8 -delimiter "," $env:temp\mail_list.csv

Пользователи, которые не меняли свой пароль в течении последних 90 дней:

$90_Days = (Get-Date).adddays(-90)
Get-ADUser -filter {(passwordlastset -le $90_days)}

Чтобы получить фотографию пользователя из Active Directory и сохранить ее в jpg файл:

$user = Get-ADUser winadmin -Properties thumbnailPhoto
$user.thumbnailPhoto | Set-Content winadmin.jpg -Encoding byte

Список групп, в которых состоит учетная запись пользователя

Get-AdUser winadmin -Properties memberof | Select memberof -expandproperty memberof

In the modern IT landscape, ensuring a computer joins the appropriate domain is more than a convenience—it’s an essential step toward consolidating control, simplifying access, and maintaining network security. This PowerShell script is designed to streamline the process of adding a computer to a domain.

Background

The Script

#Requires -Version 5.1
<#
.SYNOPSIS Joins a computer to a domain.
.DESCRIPTION Joins a computer to a domain.
.EXAMPLE -DomainName "Domain.com" -UserName "DomainMyDomainUser" -Password "Somepass1" Joins a computer to a "Domain.com" domain and restarts the computer. Don't expect a success result in Ninja as the computer will reboot before the script can return a result.
.EXAMPLE -DomainName "Domain.com" -UserName "DomainMyDomainUser" -Password "Somepass1" -NoRestart Joins a computer to a "Domain.com" domain and does not restart the computer.
.EXAMPLE PS C:> Join-Domain.ps1 -DomainName "domain.com" -UserName "DomainMyDomainUser" -Password "Somepass1" -NoRestart Joins a computer to a "Domain.com" domain and does not restart the computer.
.EXAMPLE -DomainName "Domain.com" -UserName "DomainMyDomainUser" -Password "Somepass1" -Server "192.168.0.1" Not recommended if the computer this script is running on does not have one of the Domain Controllers set as its DNS server. Joins a computer to a "Domain.com" domain, talks to the domain with the IP address of "192.168.0.1", and restarts the computer.
.OUTPUTS String[]
.NOTES Minimum OS Architecture Supported: Windows 10, Windows Server 2016 Release Notes: Initial Release
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use. Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
.COMPONENT ManageUsers
#>
[CmdletBinding()]
param ( # Domain Name to join computer to [Parameter(Mandatory = $true)] [String] $DomainName, # Use a Domain UserName to join this computer to a domain, this requires the Password parameter to be used as well [Parameter(Mandatory = $true)] [String] $UserName, # Use a Domain Password to join this computer from a domain [Parameter(Mandatory = $true)] $Password, # Used only when computer can't locate a domain controler via DNS or you wish to connect to a specific DC [Parameter()] $Server, # Do not restart computer after joining to a domain [Switch] $NoRestart
)
begin { function Join-ComputerToDomainPS2 { param ( [String] $DomainName, [PSCredential] $Credential, $Restart, $Server ) if ($Credential) { # Use supplied Credentials if ($Server) { Add-Computer -DomainName $DomainName -Credential $Credential -Server $Server -Force -Confirm:$false -PassThru } else { Add-Computer -DomainName $DomainName -Credential $Credential -Force -Confirm:$false -PassThru } } else { # No Credentials supplied, use current user Add-Computer -DomainName $DomainName -Force -Confirm:$false -PassThru } } Write-Output "Starting Join Domain" # Convert username and password into a credential object $JoinCred = [PSCredential]::new($UserName, $(ConvertTo-SecureString -String $Password -AsPlainText -Force))
}
process { Write-Output "Joining computer($env:COMPUTERNAME) to domain $DomainName" $script:JoinResult = $false try { $JoinResult = if ($NoRestart) { # Do not restart after joining if ($PSVersionTable.PSVersion.Major -eq 2) { if ($Server) { (Join-ComputerToDomainPS2 -DomainName $DomainName -Credential $Credential -Server $Server).HasSucceeded } else { (Join-ComputerToDomainPS2 -DomainName $DomainName -Credential $Credential).HasSucceeded } } else { if ($Server) { (Add-Computer -DomainName $DomainName -Credential $JoinCred -Server $Server -Force -Confirm:$false -PassThru).HasSucceeded } else { (Add-Computer -DomainName $DomainName -Credential $JoinCred -Force -Confirm:$false -PassThru).HasSucceeded } } } else { # Restart after joining if ($PSVersionTable.PSVersion.Major -eq 2) { if ($Server) { (Join-ComputerToDomainPS2 -DomainName $DomainName -Credential $Credential -Server $Server).HasSucceeded } else { (Join-ComputerToDomainPS2 -DomainName $DomainName -Credential $Credential).HasSucceeded } } else { if ($Server) { (Add-Computer -DomainName $DomainName -Credential $JoinCred -Restart -Server $Server -Force -Confirm:$false -PassThru).HasSucceeded } else { (Add-Computer -DomainName $DomainName -Credential $JoinCred -Restart -Force -Confirm:$false -PassThru).HasSucceeded } } } } catch { Write-Error "Failed to Join Domain: $DomainName" } if ($NoRestart -and $JoinResult) { Write-Output "Joined computer($env:COMPUTERNAME) to Domain: $DomainName and not restarting computer" } elseif ($JoinResult) { Write-Output "Joined computer($env:COMPUTERNAME) to Domain: $DomainName and restarting computer" if ($PSVersionTable.PSVersion.Major -eq 2) { shutdown.exe -r -t 60 } } else { Write-Output "Failed to Join computer($env:COMPUTERNAME) to Domain: $DomainName" # Clean up credentials so that they don't leak outside this script $JoinCred = $null exit 1 }
}
end { # Clean up credentials so that they don't leak outside this script $JoinCred = $null Write-Output "Completed Join Domain"
}

Access 300+ scripts in the NinjaOne Dojo

:/>  Что такое HDR в камере телефона

Detailed Breakdown

  • Parameters: These are inputs the user provides, including DomainName, UserName, Password, and Server. A switch parameter called NoRestart allows users to decide if they want the computer to restart after joining the domain.
  • Begin Block: This section initializes the script. It defines a function Join-ComputerToDomainPS2 and converts the provided username and password into a secure credential object, ready for use in the joining process.
  • Process Block: The central logic resides here. Depending on the provided parameters, the script will join the computer to the domain with or without a restart. It uses two primary PowerShell commands: Add-Computer and a user-defined function. If any errors arise during this process, they’re caught and reported.
  • End Block: This finalizes the script, cleaning up any credentials used during its execution.

Potential Use Cases

Case Study: Imagine an MSP handling IT for several small businesses. They’ve just deployed 50 new machines and need them all on the company’s domain by the start of business the next day. Using the script, the MSP quickly feeds in the required details for all machines. Within minutes, every computer is set up, without the need for manual configurations or time-consuming setups.

Comparisons

Traditional methods of joining a computer to a domain involve manual steps through the Windows interface or using legacy scripts. These methods can be time-consuming, error-prone, and don’t scale well for large deployments. Our PowerShell approach is more efficient, less error-prone, and scales to handle multiple machines.

FAQs

  • Can this script handle bulk additions of computers to a domain?
    Yes, with proper looping logic in place, you can process multiple computers.
  • What happens if the domain details provided are incorrect?
    The script will throw an error indicating the domain join failure.
:/>  Batch-file Echo

Implications

Incorrectly joining domains or exposing credentials can be detrimental to IT security. If a computer joins the wrong domain, it might access unauthorized resources or become exposed to security risks.

Recommendations

  • Always validate domain details before execution.
  • Protect and regularly rotate domain credentials.
  • Test the script in a controlled environment before deploying.

Final thoughts

In an age where automation reigns supreme, tools like this script, combined with platforms like NinjaOne, can enhance efficiency, security, and manageability. NinjaOne, in particular, offers robust monitoring and management features, ensuring that once computers are added to the domain, they remain compliant, secure, and optimized for performance.

How to Add a Server to a Domain Using PowerShell

Before you get started…

  • To be registered with an organisation on the Jotelulu platform and to have logged in.
  • A Servers subscription on the platform.
  • A defined naming policy.

Part 1 – Changing the Name of the Server

When you install a Windows server or computer, it will initially be given a random name that will probably be very difficult to remember and won’t have anything to do with its main function within the business.

# Rename-Computer -NewName <Server_Name>

  • <Server_Name> is the name you intend to give to the server.

For example, this might look something like this:

# Rename-Computer -NewName SW22DHCPSERVER01

Part 1 - Renaming and restarting the server using PowerShell
Part 1 – Renaming and restarting the server using PowerShell

Part 2 – Adding the Server to an AD DS Domain Using PowerShell

# Add-Computer <Domain>

  • <Domain> is the domain that you want to add the server to.

# Add-Computer jotelulu.com

Once you’ve done this, you’ll need to restart the server again.

Part 1 - Adding the server to the domain
Part 1 – Adding the server to the domain

Congratulations! Your server has now been joined to your Active Directory domain!

Как добавить имя пользователя и IP адрес в свойства компьютера в AD?

IP адрес компьютера мы будем хранить в атрибуте description, а имя пользователя, который работает за компьютером – в атрибуте ManagedBy.

делегирование прав Write Description + Write Managed By в AD на компьютеры

Данный PowerShell скрипт будет запускаться при входе пользователя, определять имя и IP адрес компьютера, CN пользователя и сохранит их в свойства компьютера в AD. Для работы скрипта на компьютерах должен быть установлен модуль AD PowerShell.

В консоли ADUC теперь отображаются IP адреса компьютеров, а в свойствах компьютера на вкладке Managed By теперь есть активная ссылка на учетную запись пользователя, который последним входил на компьютер.

имя пользователя в свойствах компьютера ad

Теперь вы можете быстро найти компьютеры в домене по IP адресу:

поиск компьютеров в ad по имени пользователя

Аналогичным образом вы можете записать в свойства аккаунтов компьютеров в AD любую информацию о рабочей станции или пользователе, и использовать ее для поиска (выборки) компьютеров в AD. В статье по ссылке описано как записать в описание компьютера в AD информацию о модели, серийном номере оборудования.

Изменить свойства компьютера с помощью консоли Active Directory (ADUC)

Администратор может изменить атрибуты компьютер в Active Directory с помощью графической консоли ADUC.

Изменить свойства компьютера в Active Directory

Вы можете отредактировать значения остальных атрибутов компьютера на вкладке Attribute Editor. Будьте внимательными при редактировании обязательных атрибутов компьютера. Редактор атрибутов объекта в AD не проверяет корректность введенных данных (проверяется только тип данных и длина значения), поэтому при некорректных значения атрибутов компьютера, он может потерять доверительные отношения с доменом.

Редактор атрибутов компьютера в AD

Summary

Thanks for choosing Jotelulu!

Изменить значение атрибута компьютера в AD с помощью PowerShell

Командлет Set-ADComputer (из модуля Active Directory для PowerShell) позволяет изменить атрибуты учетной записи компьютера в Active Directory.

Например, вы хотите добавить в свойства компьютера в AD его, название компании и департамента, которому он принадлежит.

Чтобы изменить значение основных атрибутов компьютера, можно использовать встроенные параметры, таки как
-Description
,
-DisplayName
,
-DNSHostName
,
-HomePage
,
-Location
и т.д., Например указать местоположение компьютера:

Set-ADComputer –Identity SRV-MAN01 –Location "Spb/Russia"

Также можно изменить значение любого атрибута с помощью параметров
Add
,
Replace
,
Clear
и
Remove
.

Задать новое описание учетной записи компьютера:

Если нужно задать несколько параметров компьютера, воспользуйтесь такой конструкцией PowerShell:

$Server = Get-ADComputer -Identity SRV-MAN01
$Server.company = "contoso"
$Server.department = "IT"
Set-ADComputer -Instance $Server

С помощью Get-ADComputer можно получить текущие значения атрибутов:

Set-ADComputer командлет PowerShell

С помощью Set-ADComputer вы также можете отключить или включить учетную запись компьютера в AD:

Set-ADComputer srv-man01 -Enabled $false