SharedIT | 묻고 답하기(AMP)

[파워쉘] AD서버 그룹별 사용자 목록을 csv 형태로 뽑고 싶어요

안녕하세요

조그만 외국계에서 IT 인프라팀 막내로 일하고 있는 신입입니다.

저희는 금감원 업무 가이드에 맞춰 논리적으로 망분리를 하고, 내부망 전용 AD 서버를 구축한 후

이를 외부 인사 DB와 연동시켜 사용하고 있어요.

(내부망용 AD 서버는 Windows Server 2012 에서 제공하는 기본 AD 서버입니다.)


내부망용 AD 서버에는 각 부서별로 그룹이 생성되어 있고, 그룹마다 부서 소속 사용자가 있습니다.

인사이동 등의 이유로 부서 그룹별로 들어있는 사용자 리스트를 정기적으로 뽑아내 비교할 일이 있어

이 작업을 파워쉘 스크립트로 자동화 하려고 합니다.

현재 AD 서버에 각 부서 한 개에 들어있는 사용자 목록을 추출해 csv로 저장하는 코드를 만들고 있습니다.

Get-ADGroupMember -identity "A부서" | Select  name | Export-csv -path C:\temp\aduserlist.csv






이렇게 1줄당 1개 부서의 사용자를 찾는 방식으로 작성한 후, -Append 옵션을 사용해서 

하나의 CSV 파일에 전체 부서 사용자가 나오게 만들려고 합니다.



aduserlist.txt


A부서

사원1

사원2

사원3


B부서

사원4

사원5



이렇게 만들기 위해서, 아래 링크를 참조하여 name 을 각 부서 이름으로 바꿔서 출력하도록

스크립트를 수정 해 보았습니다.

https://blog.naver.com/PostView.naver?blogId=vanstraat&logNo=221407010095


 

Get-ADGroupMember -identity "Audit" | Select object @{Name="Accounting"; Expression={ (Select name) } |  Export-csv -path C:\temp\aduserlist.csv -Append



이 커맨드를 실행하면 오류는 발생하지 않으나 그룹에 소속된 사용자들이 표시되지 않습니다.

혹시 name 말고 다른 식별자로 select 커맨드를 넣어야 할까요?




좋은 아이디어 있다면 도움 부탁 드리겠습니다...

감사합니다!


1개의 답변이 있습니다.

topkslee
  0 추천 | 9달 전

Get-ADUser로도 가능할 것 같은데요.

Poweshell에서 유저 가져올때 부서별 정렬해서 하면 될것 같아요.

아래와 같이 한번 해보세요.


# Import the Active Directory module

Import-Module ActiveDirectory


# Specify the distinguished name of the OU you want to extract users from

$ouDN = "OU=OU이름,DC=도메인,DC=도메인com"


# Get the list of users from the specified OU with the 'Department' and 'SamAccountName' properties

$users = Get-ADUser -Filter * -SearchBase $ouDN -Properties Department, SamAccountName | Sort-Object Department


# Display the department and username of each user

$users | ForEach-Object {

    $department = $_.Department

    $username = $_.SamAccountName

    Write-Output "$department | $username"

}

jisong.kim | 9달 전

안녕하세요 ! 친절한 답변 감사합니다.

작성 해 주신 코드로 테스트를 해 보다가 질문이 두 가지 있어서 다시 말씀 드려요!

  • 1.저희 AD 서버에 맞게 OU 경로를 설정하고 -GetADUser를 실행 해 보면 아래와 같이 부서 코드가 제대로 나오지 않는데, Department 의 값을 변환 해 주어야 할까요?



     2.  -GetADUser 명령어로 작성 해 주신 스크립트처럼 For 문을 돌리려면 옵션을 어떻게             지정 해 주어야 할까요? GetADUSer의 명령어 옵션을 잘 모르겠습니다..

번거로우실 텐데  의견 감사해요. 부탁 드립니다..



topkslee | 9달 전

AD 서버에서 Active Directory Users and Computer에서 아무 계정이나 선택해서

Properties(속성)에 들어가보세요.

그리고 탭중에 attribute editor라고 있습니다.

여기에 들어가서 부서 정보가 어디에 입력되어 있는지 체크해보세요.

보통은 department에 부서정보가 들어가는데요.

질문자분 AD에는 어디에 입력되어 있는지 체크 하셔서 위 script에서 department 자리에

부서정보가 들어가 있는 attribute 명을 입력해서 조회 해보세요.



topkslee | 9달 전

2.번은 제가 질문을 잘 이해 못했습니다. ^^;; 풀어서 설명 해주세요 ^^

jisong.kim | 9달 전

안녕하세요! 

1번은 말씀 하신 대로 AD 서버에서 계정 속성에 department 값이 설정 되어 있지 않아 발생 한 문제였습니다. 값 설정 해 주니까 잘 검색 됩니다! 

2번은 각 부서 그룹별로 묶어서 그 그룹에 있는 계정이 한번에 출력되는 방식으로 for 문을 짜려고 질문 드린 거였어요!

$DeptArray= 그룹 이름을 넣은 배열



#결과값 줄 맞추기 위한 더미 코드

Get-ADGroupMember -identity "USB_Storage" | Select-object @{Name="Dept"; Expression={ (get-objectClass) }},@{Name="name"; Expression={ (select name) }}


#실제 검색 코드


For($i=0;$i -lt 25;$i++) {


$DeptArray[$i]

Get-ADGroupMember -identity $DeptArray[$i] | Select-object @{Name="Dept"; Expression={ (get-objectClass) }},name


현재 이렇게 구성해서 제가 원하던 의도 대로 출력값이 나오는 상태입니다.

도움 감사드립니다!

topkslee | 9달 전

잘 되신다니 다행입니다.