Active Directory에서 비연결된 GPOS 찾기(및 제거하기) 방법

조직이 성장함에 따라 Active Directory (AD) 환경과 Group Policy (GP) 인프라도 함께 성장합니다. Group Policy Objects (GPOs) 역시 무작정 늘어나며, 어느새 환경을 혼란스럽게 하는 수십 개의 언링크된 GPO가 생기게 됩니다. 이를 바꿔보도록 하겠습니다.

이 튜토리얼에서는 Group Policy Management Console (GPMC)와 PowerShell을 사용하여 언링크된 GPO를 발견하는 방법을 배우게 됩니다.

자, 시작해봅시다!

준비 사항

이 문서는 실습 예제가 포함된 튜토리얼입니다. 함께 따라하려면 다음 사항이 준비되어 있는지 확인하세요:

언링크된 GPO는 어디에서 나오는 걸까요?

GPO를 생성하고 모든 설정을 정의할 때, 클라이언트 컴퓨터에 적용하려는 GPO는 실제로 아무런 동작을 수행하지 않습니다. 클라이언트 컴퓨터에 영향을 주려면 GPO를 AD 조직 단위 (OU)에 연결해야합니다.

시간이 지나면서 더 많은 관리자가 GPO를 생성하고 연결을 잊고, OU에서 GPO를 연결 해제하고, 제거하려고 하지만 실제로 제거하지 않기 때문에 아무런 동작을 수행하지 않는 GPO가 늘어날 수 있습니다. 특히 대규모 조직에서는 연결되지 않은 GPO가 적절하게 유지되지 않으면 수백 개로 증식할 수 있습니다.

GPMC에서 연결되지 않은 GPO 찾기

연결되지 않은 GPO를 찾는 방법은 두 가지입니다. GPMC를 사용하거나 PowerShell을 사용할 수 있습니다. 연결되지 않은 GPO가 소수인 경우 PowerShell 스크립트를 작성하는 대신 GPMC를 사용하는 것이 좋을 수 있습니다.

GPMC를 사용하여 연결되지 않은 GPO 찾기:

1. 시작 메뉴로 이동하여 “그룹 정책 관리”라고 입력하여 GPMC를 엽니다.

2. GPMC에서 Forest: <your forest name —> Domains —> <your domain name>으로 이동하여 도메인 이름을 마우스 오른쪽 버튼으로 클릭하고 검색을 클릭합니다. 이 작업은 그룹 정책 개체 검색 대화 상자를 표시합니다.

Search option in GPMC console

3. 검색 항목 드롭다운을 클릭하고 GPO 링크를 선택합니다. 이 검색 항목은 OU에 연결된 GPO를 검색합니다. 조건 드롭다운을 존재함으로 변경하고 도메인을 귀하의 도메인으로 설정합니다.

아래 스크린샷에서 이러한 설정의 조합은 homelab.local 도메인의 최소한 하나의 OU에 연결된 모든 GPO를 검색합니다.

완료되면, 추가를 클릭하여 기준을 추가합니다. 그것은 모든 검색 기준 섹션에 표시됩니다.

Adding search item in “Search for Group Policy Objects” window

4. 이제, 모든 검색 기준과 일치하는 모든 GPO를 찾기 위해 검색 버튼을 클릭합니다.

using search option in “Search for Group Policy Objects” window

5. 아래 스크린샷에 표시된 대로, 연결된 GPO만 검색 결과에 표시됩니다.

Search results for linked GPOs

6. 연결되지 않은 GPO를 찾으려면, 이제 아래에 표시된 것처럼 모든 GPO를 수동으로 비교합니다. 아래 스크린샷에서는 세 개의 GPO만이 연결되어 있습니다. 그룹 정책 개체 노드 아래를 살펴보면, 두 개의 GPO(UnlinkedGPO1 및 UnlinkedGPO2)가 표시되지 않는 것을 볼 수 있습니다. 그것은 그들이 연결되지 않았다는 것을 의미합니다.

이 작업은 시간이 많이 소요되며, 다음 섹션에서 PowerShell을 통해 이 작업을 수행하는 방법을 확인할 수 있습니다.

Comparing search results with all the Group Policy Objects

연결된 GPO는 아래에 표시된 것처럼 AD 개체(OU와 같은)에 할당되면 링크가 있습니다. GPO가 소수일 경우, 링크가 있는 GPO와 링크가 없는 GPO를 찾을 수 있습니다. 링크가 없는 GPO는 연결되지 않은 GPO입니다.

Displaying linked GPO

PowerShell을 사용하여 연결되지 않은 GPO 찾기

GPMC에서 GPO를 검토하는 것은 몇 개의 GPO에 대해서는 작동할 수 있지만, 수백 개 또는 수천 개의 GPO로 수천 대의 엔드포인트를 관리하는 경우 어려움이 있을 것입니다. 이 경우에는 이 프로세스를 자동화하고 편리한 PowerShell 도구를 만드는 것이 좋습니다.

가정하에 지역 도메인에 가입한 Windows PC에서 RSAT가 설치되어 있다고 가정합니다:

1. Windows PowerShell 콘솔을 엽니다.

2. GroupPolicy 모듈을 가져옵니다. GroupPolicy 모듈은 RSAT와 함께 제공되며 시스템에 이미 설치되어 있어야 합니다. 이 모듈에는 PowerShell에서 GPO를 다루기 위한 모든 명령이 포함되어 있습니다.

Import-Module GroupPolicy

3. Get-GPO PowerShell cmdlet을 All 매개변수와 함께 실행합니다. 이 cmdlet은 AD를 쿼리하고 찾은 모든 GPO를 반환합니다.

Get-GPO -All
Get-Gpo cmdlet output

4. 이제 도메인의 모든 GPO를 쿼리할 수 있으므로 언링크된 GPO를 찾아야 합니다. 이를 위해 Get-GPOReport cmdlet을 실행합니다. 이 cmdlet을 사용하면 이름과 반환할 출력 유형을 제공할 수 있습니다.

Get-GPOReport -Name SomeGPO -ReportType XML

위 단계에서 찾은 GPO 이름 중 하나를 수동으로 복사하여 이 명령을 실행하면 cmdlet이 GPO의 모든 설정을 나타내는 XML 보고서를 반환합니다. 특히 아래에 표시된 LinksTo라는 섹션을 주목하십시오. 이 섹션에는 연결된 OU의 경로를 나타내는 SOMPath XML 노드가 포함되어 있습니다.

Sample output containing LinksTo section

Get-GPOReport cmdlet은 한 번에 하나의 GPO에 대한 보고서를 가져올 수 있습니다. 이 cmdlet은 도메인에서의 검색 결과만 포함하며 AD 사이트에서는 가져오지 않습니다.

5. 이제 Get-GPO를 사용하여 모든 GPO를 찾고 그들이 무엇에 연결되어 있는지를 발견하는 cmdlet인 Get-GPOReport를 알게 되었습니다. 아래의 PowerShell 명령을 복사하여 붙여넣기하여 이들을 결합하세요.

아래 명령은 도메인에서 모든 GPO를 쿼리한 다음 각각에 대한 XML 보고서를 생성하며, 보고서에 <LinksTo> 문자열이 없는 것만 반환합니다. (Select-String)

Get-GPO -All | Where-Object {
     $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>"
 }

튜토리얼 환경에서 아래 예제에서 볼 수 있듯이 UnlinkedGPO1UnlinkedGPO2는 OU에 연결되어 있지 않습니다.

Listing out unlinked GPO in the domain

연결되지 않은 GPO PowerShell 도구 빌드

이제 배운 모든 것을 함께 모아 실제 환경에서 사용할 수 있는 PowerShell 스크립트를 만들어 봅시다.

1. 좋아하는 코드 편집기를 열고 다음 PowerShell 스크립트를 복사하여 붙여넣습니다. 스크립트를 Remove-UnlinkedGPO.ps1로 저장합니다. 이 스크립트는:

  • 현재 날짜로 폴더를 생성하여 연결되지 않은 GPO 보고서를 저장합니다.
  • AD에서 연결되지 않은 모든 GPO를 찾습니다.
  • 각 연결되지 않은 GPO에 대한 HTML 보고서를 생성하고 디스크에 저장합니다.
  • 연결되지 않은 모든 GPO의 목록을 생성하고 텍스트 파일에 추가합니다.
  • 각 연결되지 않은 GPO를 확인 단계와 함께 Remove-GPO cmdlet를 사용하여 제거합니다.

GitHub를 통해 Remove-UnlinkedGPO.ps1 스크립트를 다운로드할 수도 있습니다.

Import-Module GroupPolicy
 $Date = Get-Date -Format dd_MM_yyyy
 $BackupDir = "c:\GPOBackup\$Date"
## GPO 보고서를 저장할 디렉터리를 생성합니다.
 if (-Not(Test-Path -Path $BackupDir))  {
   New-Item -ItemType Directory $BackupDir -Force
 }
# XML 형식의 gpo 보고서 유형을 가진 모든 GPO를 가져오고 xml 보고서에서 섹션을 찾습니다.
# 섹션을 가지지 않는 GPO만을 고려합니다.
 Get-GPO -All | Where-Object { $_ | Get-GPOReport -ReportType XML | Select-String -NotMatch "<LinksTo>" } | ForEach-Object {
   # GPO 백업, HTML 보고서 및 GPO 세부 정보를 텍스트 파일에 저장하는 것은 선택 사항입니다.
   Backup-GPO -Name $_.DisplayName -Path $BackupDir
    # 보고서를 실행하고 디스크에 HTML 보고서로 저장합니다.
   Get-GPOReport -Name $_.DisplayName -ReportType Html -Path "$BackupDir\$($_.DisplayName).html"
   # 백업 폴더에 UnlinkedGPOs.txt라는 텍스트 파일을 생성하고 추가합니다.
   # Get-GPO가 반환하는 각 GPO 개체를 포함합니다.
   $_ | Select-Object * | Out-File "$BackupDir\UnLinkedGPOs.txt" -Append
   # GPO를 제거하지만 제거하기 전에 확인 메시지를 표시합니다.
   $_.Displayname | Remove-GPO -Confirm
 }

2. Remove-UnlinkedGPO.ps1 스크립트를 실행합니다.

3. 연결되지 않은 GPO가 발견되면 스크립트가 해당 GPO를 제거하라는 메시지가 표시됩니다. 이 메시지는 Remove-GPO cmdlet을 사용하여 Confirm 스위치를 이용하여 나옵니다. 해당 단일 GPO의 제거를 확인하려면 를 클릭하고, 그렇지 않으면 모든 연결되지 않은 GPO를 추가 확인 없이 제거하려면 모두에게 예를 클릭하세요.

GPO deletion confirmation prompt

스크립트가 완료되고 적어도 하나의 연결되지 않은 GPO가 발견되면, C:\GPOBackup\<날짜> 폴더에서 GPO 내용을 GUID 폴더로서 HTML 보고서 및 UnlinkedGPOs.txt 파일과 함께 확인할 수 있습니다.

Displaying Backup Folder

4. 이제 웹 브라우저로 하나의 GPO HTML 보고서를 엽니다. 보고서 아래에는 해당 GPO에서 정의된 모든 설정이 포함되어 있습니다. 아래 예에서 UnlinkedGPO1 GPO에는 PowerShell 실행 정책에 대한 설정이 포함되어 있습니다.

GPO HTML report

5. 마지막으로, UnlinkedGPOs.txt 파일을 엽니다. 이 파일에는 Get-GPO cmdlet에서 받은 출력과 동일한 내용이 포함되어 있습니다.

UnlinkedGPOs.txt GPO listing

결론

이제 GPMC와 PowerShell을 사용하여 AD 환경에서 모든 연결되지 않은 GPO를 찾는 방법을 알게 되었습니다.

어떤 방법을 선호하시나요? PowerShell 스크립트를 개선할 수 있는 방법을 생각해 보실 수 있나요?

Source:
https://adamtheautomator.com/unlinked-gpo/