SharedIT | 묻고 답하기(AMP)

파워쉘

안녕하세요, 

한 외국회사 한국지사의 전산을 담당하고 있는데요, 

이번에 본사 감사에서 지적사항 나온 부분이 

AD 서버 계정 생성/삭제, 권한부여/삭제 시 각 요소들 마다 변경 날짜를 기록하라는 부분입니다. 

그래서 일단 파워쉘로 개인이 가진 모든 CN 들만 쏙 ~ 빼서 CSV 파일로 저장하려고 하는데요, 



Get-ADUser -Identity USER_ID -Properties Memberof | Select Memberof 에서 

(CN=XXX1, OU=YYY1, DC=ZZ, DC=local, CN=XXX2, OU=YYY2, DC=ZZ, DC=local, ............)

 

개인이 가진 CN 값만 쏙 ~ 빼고 싶은데 혹시 방법 아시는 분 있나요? 
구글 검색해서 사람들이 알려주는 방법으로 해봤는데 잘 동작이 안 되네요 ;;

5개의 답변이 있습니다.

wansoo
  0 추천 | 6년 이하 전
아래와 같이 두 줄로 나눠서 실행하면 어떤 결과가 나올지 궁금하네요~ ^^;;
abc.txt에 내용을 임시 저장한 후에 다시 읽어 와서 처리하는 형태로...

Get-ADUser -Identity USER_ID -Properties Memberof | Select Memberof > abc.txt
cat abc.txt | foreach-object{ ((($_.split(",") | select-string 'CN=') -creplace 'CN=','') -creplace '\(', '') -creplace ' ','' ; }

Jinwoo Yoo | 6년 이하 전

멤버로 속한 곳 결과가 3개만 나옵니다. Get-ADUser -Identity USER_ID -Properties Memberof | Select Memberof 의 결과가 아무래도 모든 소속을 다 담고 보여주진 않아서 그런 것 같습니다. ;; 1XX명의 사람들 아이디를 쭉 가져오는 건 성공했는데, 그 안 사람 아아디들을 차례로 하나씩 불러와서 가진 권한을 쫘악 정리하고 싶은데, 아 - 뭔가 쉽지 않네요 ㅋㅋ 몇 번의 대답 덕분에 새롭게 활용할 수 있는 부분을 많이 배웁니다 ^^
wansoo
  0 추천 | 6년 이하 전
[string[]](Get-ADUser -Identity USER_ID -Properties Memberof | Select Memberof) 

까지만 실행했을때 어떤 결과가 나오는지 궁금하네요..?

Jinwoo Yoo | 6년 이하 전

@{Memberof=Microsoft.ActiveDirectory.Management.ADPropertyValueCollection} 요렇게 결과 나옵니다 ~ ^^
wansoo
  0 추천 | 6년 이하 전
아래와 같이도 한번 해 보시구요~
[string[]](Get-ADUser -Identity USER_ID -Properties Memberof | Select Memberof) | foreach-object{ ((($_.split(",") | select-string 'CN=') -creplace 'CN=','') -creplace '\(', '') -creplace ' ','' ; }

Jinwoo Yoo | 6년 이하 전

요건 에러는 안 나는데, 결과가 아무것도 안 나와요 ㅎ 아고 ~ 계속되는 질문에 답변 너무 감사합니다 ㅜ
wansoo
  0 추천 | 6년 이하 전
명령을 아래와 같이 한번 사용해 보세요~

[array](Get-ADUser -Identity USER_ID -Properties Memberof | Select Memberof) | foreach-object{ ((($_.split(",") | select-string 'CN=') -creplace 'CN=','') -creplace '\(', '') -creplace ' ','' ; }

split()는 기본 메소드로 보입니다.

Jinwoo Yoo | 6년 이하 전

Method invocation failed because [Selected.Microsoft.ActiveDirectory.Management.ADUser] doesn't contain a method named 'split'. At line:1 char:95 + [array](Get-ADUser -Identity PS1155 -Properties Memberof | Select Memberof) | fo ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (split:String) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound
wansoo
  0 추천 | 6년 이하 전
Get-ADUser -Identity USER_ID -Properties Memberof | Select Memberof 의 결과가 
(CN=XXX1, OU=YYY1, DC=ZZ, DC=local, CN=XXX2, OU=YYY2, DC=ZZ, DC=local, ............) 와 같은 형식으로 출력될 경우에 CN=에 해당하는 값만을 추출하는 내용을 한번 만들어 봤네요~

Get-ADUser -Identity USER_ID -Properties Memberof | Select Memberof | foreach-object{ ((($_.split(",") | select-string 'CN=') -creplace 'CN=','') -creplace '\(', '') -creplace ' ','' ; }


앞부분 Get-ADUser -Identity USER_ID -Properties Memberof  | Select Memberof 명령 까지는 설명하지 않아도 될 것 같고...

foreach-object{ $_.split(",") ; }  은 "|" 앞부분의 결과가 여러 Line일 경우에 각  Line 별로 나눠서 실행하면서 각 Line 내의 내용을 ","를 기준으로 칼럼을 분해하고요.

select-string 'CN='   는  "|" 앞의 결과들 중에서 'CN=' 이 포함한 항목만을 추출하고요.

-creplace 'CN=',''  에 의해 'CN=' 에 해당하는 문자열을 제거하고요.

 -creplace '\(', '' 는 문자열 중에 "("가 붙어 있을 경우에 제거하기 위해 넣었고요. "(" 는 특수 문자로 사용되기 때문에  Escape (\) 처리해서 특수성을 제거하여 일반 "("로 처리한 것이고요.

-creplace ' ',''  는 문자열 중에 빈칸이 남아 있을 경우에 빈칸을 없애기 위해 넣었고요.

결과가 한줄로 구성되어도 상관없고, 여러 줄이 나와도 CN= 다음에 있는 값들만 모두 추출해주게 될겁니다.
 

Jinwoo Yoo | 6년 이하 전

와 ~ 자세한 답변 감사드립니다. 시도해보니, split 부분에서 에러가 나네요 ㅜ 파워쉘에 저 메소드 사용하려면 추가적으로 설치해야하는 게 있나요? Method invocation failed because [Selected.Microsoft.ActiveDirectory.Management.ADUser] doesn't contain a method named 'split'. At line:1 char:86 + Get-ADUser -Identity PS1155 -Properties Memberof | Select Memberof | foreach-obj ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (split:String) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound