활성 광고 사용자의 Powershell 목록입니다. 많은 사용자 목록이 구성원으로 속한 선택된 AD 그룹 목록을 얻는 방법은 무엇입니까? 스포일러가 있는 요청 코드

오늘은 모든 사용자 목록을 Active Directory에서 별도의 파일로 다운로드해 보겠습니다. 이 문제에 대한 우리의 주요 조수는 PowerShell입니다. 문제는 Microsoft가 처음에 Windows 서버 구성 요소를 관리하기 위한 기본 도구로 PowerShell 명령 콘솔을 계획했다는 것입니다. 그리고 오늘날 우리가 이미 버전 2.0을 가지고 있다면 대체로 그렇습니다.

최근에도 AD와 어떻게든 상호 작용하려면 관리자는 dsquery 유틸리티나 다양한 종류의 스크립트 또는 유틸리티를 마음대로 사용할 수 있어야 했습니다. 이제 Windows Server 2008 R2부터 PowerShell을 통해 AD 작업을 수행할 수 있습니다. PowerShell 2.0의 출현으로 Active Directory와 상호 작용하는 데 특수 모듈이 사용됩니다. Windows PowerShell용 Active Directory 모듈, 여기에는 필요한 cmdlet 목록이 포함되어 있습니다. 작업을 위해 다음 명령을 사용합니다. Get-ADUser.

따라서 PowerShell 콘솔을 실행할 운영 체제에 따라 "준비 단계"를 수행해야 합니다.

1) Windows Server에서 작업하는 경우 2012 버전까지, 그런 다음 다음 명령을 실행해야 합니다.

  • 가져오기 모듈 활성 디렉터리 – 모듈을 AD로 가져오는 명령

2012 이상의 운영 체제 버전에서는 이 모듈이 이미 기본적으로 활성화되어 있습니다.

2) 클라이언트 Windows에서 작업하는 경우 Windows PowerShell용 Active Directory 모듈 구성 요소와 함께 RSAT 원격 관리 패키지를 설치해야 합니다.

Get-ADUser cmdlet은 업로드되는 데이터의 양이 최대 1000명의 사용자일 때 실행하는 것이 좋습니다.

PowerShell을 사용하여 AD 사용자를 별도의 파일로 내보내기

먼저 Get-ADUser 명령에 대한 도움말을 호출해 보겠습니다. 결과적으로 추가 관리에 필요한 모든 명령을 받게 됩니다.

  • Get-ADUser 도움말 – 도움을 요청하는 명령

PowerShell 창에서 모든 속성을 가진 모든 사용자 목록을 얻으려면 다음 명령을 실행해야 합니다.

  • Get-ADUser -필터 * – AD 사용자 목록 내보내기

이 업로드는 완전한 정보를 제공하지 않으며 창에 필요한 모든 정보를 표시하지 않습니다. 따라서 검색 범위를 좁히고 user1이라는 특정 사용자의 속성을 표시해 보겠습니다.

  • Get-ADUser -identity user1 -properties * – 특정 사용자의 속성 내보내기

이제 속성이 포함된 모든 사용자 목록을 외부로 내보내 보겠습니다. txt 또는 csv파일:

  • Get-ADUser -filter * -properties * | 내보내기-csv -경로 c:\users.csv -유니코드 인코딩 – 사용자를 별도의 파일로 내보내기

핵심에 특히 주목하고 싶습니다. - 유니코드 인코딩. 이는 AD에서 내보낸 후 러시아 키릴 문자가 업로드된 파일에 올바르게 표시될 수 있도록 하는 역할을 합니다. 예를 들어 Microsoft Excel을 사용하면 러시아어 문자 대신 물음표가 표시됩니다.

파일을 볼 때 데이터는 한 줄로 내보내지므로 읽을 수 없습니다. 이를 변경하려면 다음을 수행해야 합니다.

PowerShell을 사용하여 AD를 관리하는 데 전념합니다. 시작점으로 저자는 10가지 일반적인 AD 관리 작업을 선택하고 PowerShell을 사용하여 이를 단순화할 수 있는 방법을 살펴보기로 결정했습니다.

  1. 사용자 비밀번호 재설정
  2. 계정 활성화 및 비활성화
  3. 사용자 계정 잠금 해제
  4. 계정 삭제
  5. 빈 그룹 찾기
  6. 그룹에 사용자 추가
  7. 그룹 구성원 나열
  8. 오래된 컴퓨터 계정 찾기
  9. 컴퓨터 계정 비활성화
  10. 유형별로 컴퓨터 찾기

또한 작성자는 블로그(물론 PowerShell을 사용하여)를 운영하고 있으므로 jdhitsolutions.com/blog를 살펴보는 것이 좋습니다. 그리고 그의 트위터에서 최신 정보를 얻을 수 있습니다. twitter.com/jeffhicks.
따라서 다음은 "PowerShell로 해결된 상위 10가지 Active Directory 작업" 기사의 번역입니다.

Windows PowerShell을 사용하여 AD(Active Directory)를 관리하는 것은 생각보다 쉽습니다. 이를 증명해 보이고 싶습니다. 아래 스크립트를 사용하여 다양한 AD 관리 작업을 해결할 수 있습니다.

요구사항

PowerShell을 사용하여 AD를 관리하려면 몇 가지 요구 사항을 충족해야 합니다. Windows 7 컴퓨터를 예로 들어 AD cmdlet이 어떻게 작동하는지 보여 드리겠습니다.
cmdlet을 사용하려면 Windows Server 2008 R2 도메인 컨트롤러가 있어야 합니다. 또는 레거시 DC에 Active Directory 관리 게이트웨이 서비스를 다운로드하여 설치할 수 있습니다. 설치하기 전에 설명서를 주의 깊게 읽으십시오. CD 재부팅이 필요합니다.
클라이언트 측에서 Windows 7 또는 Windows 8용 RSAT를 다운로드하여 설치합니다. Windows 7에서는 다음 위치에서 열어야 합니다. 제어판프로그램들그리고 선택 Windows 기능 켜기 또는 끄기. 찾다 원격 서버 관리 도구섹션을 확장하고 역할 관리 도구. AD DS 및 AD LDS 도구에 적합한 항목을 선택합니다. 특히 해당 항목을 선택해야 합니다. Windows PowerShell용 Active Directory 모듈, 그림 1과 같습니다. (Windows 8에서는 기본적으로 모든 도구가 선택되어 있습니다.) 이제 우리는 일할 준비가 되었습니다.

그림 1 AD DS 및 AD LDS 도구 활성화

도메인 관리자 권한이 있는 계정으로 로그인했습니다. 앞으로 보여드릴 대부분의 cmdlet에서는 대체 자격 증명을 지정할 수 있습니다. 어쨌든 도움말을 읽어보는 것이 좋습니다( 도움말 얻기) 및 아래에서 설명할 예를 살펴보겠습니다.
PowerShell 세션을 시작하고 모듈을 가져옵니다.

PS C:\> 가져오기 모듈 ActiveDirectory

가져오기를 통해 새 PSDrive가 생성되지만 우리는 이를 사용하지 않을 것입니다. 그러나 가져온 모듈에서 어떤 명령을 사용할 수 있는지 확인할 수 있습니다.

PS C:\> get-command -module ActiveDirectory

이러한 명령의 장점은 하나의 AD 개체에 명령을 사용할 수 있으면 10, 100, 심지어 1000에서도 사용할 수 있다는 것입니다. 이러한 cmdlet 중 일부가 어떻게 작동하는지 살펴보겠습니다.

작업 1: 사용자 비밀번호 재설정

일반적인 작업인 사용자 비밀번호 재설정부터 시작해 보겠습니다. cmdlet을 사용하면 쉽고 간단하게 이 작업을 수행할 수 있습니다. 세트-ADAccountPassword. 까다로운 부분은 새 비밀번호가 보호된 문자열, 즉 PowerShell 세션 동안 암호화되어 메모리에 저장되는 텍스트로 정규화되어야 한다는 것입니다. 먼저 새 비밀번호를 사용하여 변수를 생성해 보겠습니다.
PS C:\> $new=Read-Host "새 비밀번호를 입력하세요" -AsSecureString

그런 다음 새 비밀번호를 입력하세요.

이제 계정을 추출할 수 있습니다(다음을 사용하여 샘계정 이름– 최선의 선택) 새 비밀번호를 설정하세요. 다음은 Jack Frost 사용자의 예입니다.

PS C:\> Set-ADAccountPassword jfrost -NewPassword $new

불행하게도 이 cmdlet에는 버그가 있습니다. -통과, -만약, 그리고 -확인하다작동하지 않습니다. 바로가기를 선호하는 경우 다음을 시도해 보세요.

PS C:\> Set-ADAccountPassword jfrost -NewPassword (ConvertTo-SecureString -AsPlainText -String "P@ssw0rd1z3" -force)

결과적으로 Jack이 다음에 로그인할 때 비밀번호를 변경해야 하므로 다음을 사용하여 계정을 수정합니다. 세트-ADUser.

PS C:\> Set-ADUser jfrost -ChangePasswordAtLogon $True

cmdlet 실행 결과는 콘솔에 기록되지 않습니다. 이 작업을 수행해야 하는 경우 다음을 사용하세요. -진실. 하지만 cmdlet을 사용하여 사용자 이름을 검색하면 작업이 성공했는지 여부를 알 수 있습니다. Get-ADUser속성을 지정하고 비밀번호가 만료되었습니다, 그림 2와 같이.


쌀. 2. PasswordExpired 속성을 사용한 Get-ADUser Cmdlet의 결과

요점: PowerShell을 사용하여 사용자 비밀번호를 재설정하는 것은 전혀 어렵지 않습니다. 비밀번호 재설정도 스냅을 통해 쉽다는 걸 인정합니다 Active Directory 사용자 및 컴퓨터콘솔 마이크로소프트 관리 콘솔(MMC).그러나 작업을 위임해야 하거나 위에서 언급한 스냅인을 배포하고 싶지 않거나 대규모 자동화 IT 프로세스의 일부로 암호를 재설정하려는 경우에는 PowerShell을 사용하는 것이 적합합니다.

작업 2: 계정 활성화 및 비활성화

이제 계정을 비활성화해 보겠습니다. Jack Frost와 계속 협력합시다. 이 코드는 매개변수를 사용합니다. -만약, 명령을 실행하지 않고 테스트하기 위해 변경하는 다른 comadlet에서 찾을 수 있습니다.

PS C:\> 비활성화-ADAccount jfrost -whatif What if: 대상 "CN=Jack Frost, OU=staff,OU=Testing,DC=GLOBOMANTICS,DC=local"에서 "Set" 작업을 수행하는 중입니다.

이제 실제로 비활성화해 보겠습니다.

PS C:\> ADAAccount jfrost 비활성화

그리고 계정을 활성화할 때가 되면 어떤 cmdlet이 도움이 될까요?

PS C:\> 활성화-ADAccount jfrost

이러한 cmdlet은 파이프라인 표현식에서 사용할 수 있으므로 원하는 만큼 많은 계정을 활성화하거나 비활성화할 수 있습니다. 예를 들어, 이 코드는 영업 부서의 모든 계정을 비활성화합니다.

PS C:\> get-aduser -filter "department -eq "sales"" | 계정 비활성화

물론 필터를 작성하세요. Get-ADUser꽤 복잡하지만 여기서 매개변수를 사용하면 됩니다. -만약 cmdlet과 함께 AD계정 비활성화구출하러 온다.

작업 3: 사용자 계정 잠금 해제

Jack이 새 비밀번호를 입력하려고 시도하는 동안 계정이 잠긴 상황을 생각해 보세요. GUI를 통해 계정을 찾는 대신 간단한 명령을 사용하여 잠금 해제 절차를 수행할 수 있습니다.

PS C:\> ADA계정 잠금 해제 jfrost

cmdlet은 매개변수도 지원합니다. -만약그리고 -확인하다.

작업 4: 계정 삭제

제거하는 사용자 수는 중요하지 않습니다. cmdlet을 사용하면 쉽습니다. 제거-ADUser. Jack Frost를 제거하고 싶지는 않지만 원한다면 다음과 같은 코드를 사용할 것입니다.

PS C:\> Remove-ADUser jfrost -whatif What if: 대상 "CN=Jack Frost,OU=staff,OU=Testing,DC=GLOBOMANTICS,DC=local"에서 "제거" 작업을 수행하는 중입니다.

또는 여러 사용자를 입력하고 간단한 명령 하나로 삭제할 수 있습니다.

PS C:\> get-aduser -filter "enabled -eq "false"" -property WhenChanged -SearchBase "OU=직원, DC=Globomantics,DC=Local" | where ($_.WhenChanged -le (Get-Date).AddDays(-180)) | 제거-ADuser -whatif

이 명령은 180일 이상 수정되지 않은 비활성화된 직원 OU 계정을 찾아서 삭제합니다.

작업 5: 빈 그룹 찾기

그룹을 관리하는 것은 끝이 없고 감사할 일이 아닙니다. 빈 그룹을 찾는 방법에는 여러 가지가 있습니다. 조직에 따라 일부 표현이 다른 표현보다 더 잘 작동할 수 있습니다. 아래 코드는 기본 제공 그룹을 포함하여 도메인의 모든 그룹을 찾습니다.

PS C:\> get-adgroup -filter * | 여기서 (-Not ($_ | get-adgroupmember)) | 이름 선택

수백 명의 구성원이 있는 그룹이 있는 경우 이 명령을 사용하는 데 시간이 오래 걸릴 수 있습니다. Get-ADGroupMember각 그룹을 확인합니다. 제한하거나 사용자 정의할 수 있다면 더 좋을 것입니다.
또 다른 접근 방식은 다음과 같습니다.

PS C:\> get-adgroup -filter "members -notlike "*" -AND GroupScope -eq "Universal"" -SearchBase "OU=그룹,OU=직원,DC=Globomantics, DC=로컬" | 이름, 그룹 선택*

이 명령은 OU 그룹의 구성원이 아닌 모든 유니버설 그룹을 찾고 일부 속성을 표시합니다. 결과는 그림 3에 나와 있습니다.


쌀. 3. 유니버설 그룹 검색 및 필터링

작업 6: 그룹에 사용자 추가

Chicago IT 그룹에 Jack Frost를 추가해 보겠습니다.

PS C:\> add-adgroupmember "chicago IT" -회원 jfrost

예, 아주 간단합니다. 수백 명의 사용자를 그룹에 쉽게 추가할 수도 있지만 이것이 약간 어색하다고 생각됩니다.

PS C:\> Add-ADGroupMember "Chicago Employees" -member (get-aduser -filter "city -eq "Chicago"")

저는 시카고에 City 속성을 가지고 있는 모든 사용자를 찾기 위해 괄호 안에 있는 파이프라인 표현식을 사용했습니다. 괄호 안의 코드가 실행되고 결과 개체가 –Member 매개 변수에 전달됩니다. 각 사용자 개체는 Chicago Employees 그룹에 추가됩니다. 5명 또는 5000명의 사용자를 처리하는지 여부는 중요하지 않습니다. 그룹 멤버십을 업데이트하는 데는 몇 초 밖에 걸리지 않습니다. 이 표현은 다음을 사용하여 작성할 수도 있습니다. ForEach-객체무엇이 더 편리할까요?

PS C:\> Get-ADUser -filter "city -eq "시카고"" | foreach(Add-ADGroupMember "Chicago Employees" -멤버 $_)

작업 7: 그룹 구성원 나열

특정 그룹에 누가 있는지 알고 싶을 수도 있습니다. 예를 들어, Domain Admins 그룹의 구성원이 누구인지 정기적으로 찾아야 합니다.

PS C:\> Get-ADGroupMember "도메인 관리자"

그림 4는 결과를 보여줍니다.


쌀. 4. 도메인 관리자 그룹의 구성원

cmdlet은 각 그룹 구성원에 대한 AD 개체를 표시합니다. 중첩된 그룹으로 무엇을 해야 합니까? 내 그룹 Chicago All Users는 중첩된 그룹의 모음입니다. 모든 계정 목록을 얻으려면 매개변수만 사용하면 됩니다. –재귀적.

PS C:\> Get-ADGroupMember "시카고 모든 사용자" -재귀 | 고유 이름 선택

다른 방향으로 가고 싶다면 - 사용자가 속한 그룹 찾기 - 사용자 속성을 사용하세요. 의 멤버이다:

PS C:\> get-aduser jfrost -property Memberof | -ExpandProperty memberOf CN=NewTest,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local CN=Chicago Test,OU=Groups,OU=Employees, DC=GLOBOMANTICS,DC=local CN=Chicago IT,OU=를 선택합니다. 그룹,OU=직원, DC=GLOBOMANTICS,DC=로컬 CN=시카고 판매 사용자,OU=그룹,OU=직원, DC=GLOBOMANTICS,DC=로컬

매개변수를 사용했습니다. -ExpandProperty이름을 표시하려면 의 멤버이다선처럼.

작업 8: 오래된 컴퓨터 계정 찾기

저는 "오래된 컴퓨터 계정을 어떻게 찾나요?"라는 질문을 많이 받습니다. 그리고 저는 항상 이렇게 대답합니다. "당신에게 구식은 무엇입니까?" 회사에서는 컴퓨터 계정(또는 사용자 계정, 상관없음)이 더 이상 사용되지 않는 것으로 간주되어 더 이상 사용할 수 없는 경우에 대해 서로 다른 정의를 가지고 있습니다. 저는 일정 기간 동안 비밀번호가 변경되지 않은 계정에 주목합니다. 이 기간은 90일입니다. 이 기간 동안 컴퓨터가 도메인과 함께 비밀번호를 변경하지 않은 경우 오프라인 상태이고 오래된 것일 가능성이 높습니다. 사용된 cmdlet Get-AD컴퓨터:

PS C:\> get-adcomputer -filter "Passwordlastset -lt "2012년 1월 1일"" -properties *| 이름, 비밀번호 마지막 설정 선택

필터는 고정 값과 함께 잘 작동하지만 이 코드는 2012년 1월 1일 이후 비밀번호를 변경하지 않은 모든 컴퓨터 계정에 대해 업데이트됩니다. 결과는 그림 5에 나와 있습니다.


쌀. 5. 오래된 컴퓨터 계정 찾기

또 다른 옵션: 최소한 Windows 2003 도메인 기능 수준에 있다고 가정해 보겠습니다. 마지막로그온시간스탬프. 이 값은 1601년 1월 1일 이후 100나노초 간격의 숫자이고 GMT로 저장되므로 이 값으로 작업하는 것은 약간 까다롭습니다.

PS C:\> get-adcomputer -filter "LastlogonTimestamp -gt 0" -properties * | 이름 선택, 마지막 로그온 타임스탬프, @(Name="LastLogon";Expression=(::FromFileTime ($_.Lastlogontimestamp))),passwordlastset | 마지막LogonTimeStamp 정렬


쌀. 6. LastLogonTimeStamp 값을 친숙한 형식으로 변환합니다.

필터를 생성하려면 날짜(예: 2012년 1월 1일)를 올바른 형식으로 변환해야 합니다. 변환은 FileTime에서 수행됩니다.

PS C:\> $cutoff=(Get-Date "2012/1/1").ToFileTime() PS C:\> $cutoff 129698676000000000

이제 필터에서 이 변수를 사용하여 다음을 수행할 수 있습니다. Get-AD컴퓨터:

PS C:\> Get-ADComputer -Filter "(lastlogontimestamp -lt $cutoff) -또는 (lastlogontimestamp -notlike "*")" -property * | 이름, 마지막 로그온 타임스탬프, 비밀번호LastSet 선택

위의 코드는 그림 5에 표시된 것과 동일한 컴퓨터를 찾습니다.

작업 9: 컴퓨터 계정 비활성화

아마도 비활성 계정이나 오래된 계정을 발견하면 해당 계정을 비활성화하고 싶을 것입니다. 이것은 매우 쉽습니다. 사용자 계정 작업에 사용한 것과 동일한 cmdlet을 사용하겠습니다. 다음을 사용하여 명확하게 할 수 있습니다. 샘계정 이름계정.

PS C:\> 비활성화-ADAccount -ID "chi-srv01$" -what if: 대상 "CN=CHI-SRV01, CN=컴퓨터,DC=GLOBOMANTICS,DC=local"에서 "설정" 작업을 수행하는 중입니다.

또는 파이프라인 표현식을 사용하여:

PS C:\> get-adcomputer "chi-srv01" | AD계정 비활성화

또한 내 코드를 사용하여 오래된 계정을 찾아 모두 비활성화할 수도 있습니다.

PS C:\> get-adcomputer -filter "Passwordlastset -lt "2012년 1월 1일"" -properties *| AD계정 비활성화

작업 10: 유형별로 컴퓨터 찾기

또한 서버나 워크스테이션 등 유형별로 컴퓨터 계정을 찾는 방법에 대한 질문도 자주 받습니다. 이를 위해서는 약간의 창의성이 필요합니다. AD에는 아마도 OS를 제외하고는 서버와 클라이언트를 구별하는 것이 없습니다. 컴퓨터에서 Windows Server 2008을 실행하는 경우 몇 가지 추가 단계를 수행해야 합니다.
먼저 운영 체제 목록을 가져와야 하며 그런 다음 사용 가능한 운영 체제별로 계정을 필터링합니다.

PS C:\> Get-ADComputer -Filter * -속성 운영 체제 | 운영 체제 - 고유 | 운영 체제 정렬

결과는 그림 7에 나와 있습니다.


쌀. 7. OS 목록 검색

서버 OS를 실행하는 모든 컴퓨터를 찾고 싶습니다.

PS C:\> Get-ADComputer -Filter "OperatingSystem -like "*Server*"" -properties OperatingSystem,OperatingSystem ServicePack | 이름,Op* 선택 | 형식 목록

결과는 그림 8에 나와 있습니다.

다른 AD Get cmdlet과 마찬가지로 검색 매개 변수를 사용자 지정하고 필요한 경우 요청을 특정 OU로 제한할 수 있습니다. 제가 보여드린 모든 표현식은 더 큰 PowerShell 표현식에 통합될 수 있습니다. 예를 들어 정렬, 그룹화, 필터 적용, CSV로 내보내기, HTML 보고서 생성 및 이메일 전송 등의 작업이 모두 PowerShell에서 가능합니다! 이 경우 단일 스크립트를 작성할 필요가 없습니다.
보너스는 HTML 파일에 저장된 사용자 비밀번호 사용 기간 보고서입니다.

PS C:\> Get-ADUser -필터 "활성화 -eq "True" -AND PasswordNeverExpires -eq "False"" -속성 PasswordLastSet,PasswordNeverExpires,PasswordExpired | DistinguishedName,Name,pass*,@(Name="PasswordAge"; Expression=((Get-Date)-$_.PasswordLastSet)) |sort PasswordAge -Descending | ConvertTo-Html -Title "비밀번호 사용 기간 보고서" | Out-File c:\Work\pwage.htm !}

이 표현은 다소 위협적으로 보일 수 있지만 최소한의 PowerShell 지식만으로도 쉽게 사용할 수 있습니다. 마지막으로 남은 조언은 '사용자 정의 속성을 정의하는 방법'입니다. 비밀번호나이. 값은 today와 PasswordLastSet 속성 사이의 간격을 나타냅니다. 그런 다음 새 부동산에 대한 결과를 정렬합니다. 그림 9는 소규모 테스트 도메인의 출력을 보여줍니다.

업데이트:
게시물에는 포털에 있는 기사의 번역이 포함되어 있습니다.

0

CSV 파일에 있는 대규모 사용자 목록이 AD 그룹의 구성원인지 확인하고 결과를 results.csv에 기록하는 다음 작업 스크립트가 있습니다.

$group = "InfraLite"를 $group = DC .\List_Of_AD_Groups.CSV 로 변경할 수 있도록 스크립트를 변환하는 방법을 잘 모르겠습니다.

따라서 스크립트는 하나의 AD 그룹에 대한 일치 항목만 반환하는 것이 아니라 List_of_AD_groups.csv에 포함된 80개 AD 그룹에 대한 일치 항목을 반환합니다. 새 CSV 열에 각 AD 그룹에 대해 YES/NO를 작성합니다(또는 이것이 가능하지 않은 경우 결과가 포함된 각 그룹에 대해 별도의 CSV 파일을 생성하면 동일하게 수행됩니다.

$group의 값과 내보내기 파일 이름을 변경하고 스크립트를 80번 다시 실행하여 이 작업을 수동으로 수행할 수 있지만 이 작업을 수행하려면 PS를 사용하여 신속하게 수행해야 합니다.

예를 들어 results.csv?:

이름 AD_GROUP1 AD_GROUP2 AD_GROUP80 등 user1 예 아니요 예 user2 아니요 아니요 예 user3 아니요 예 아니요 echo "UserName`InfraLite" >> results.csv $users = GC .\user_list.csv $group = "InfraLite" $members = Get-ADGroupMember -Identity $group -Recursive | -ExpandProperty SAMAccountName foreach ($user in $users) ( if ($members -contains $user) ( echo "$user $group`tYes" >> results.csv ) else ( echo "$user`tNo" >> 결과 선택 .csv) )

  • 답변 2개
  • 정렬:

    활동

0

문제에 대한 간단한 해결책은 기존 코드를 다른 루프로 래핑하고 각 그룹에 대한 출력 파일을 만드는 것입니다.

$groups = Get-Content "C:\groups.txt" foreach($groups의 $group)( $members = Get-ADGroupMember ... ... )

보다 세련된 접근 방식은 그룹 매핑 템플릿을 만들고 이를 각 사용자에 대해 복제한 다음 사용자의 그룹 멤버십으로 복사본을 채우는 것입니다. 다음과 같이 작동해야 합니다.

$template = @() Get-Content "C:\groups.txt" | ForEach-Object ( $template[$_] = $false ) $groups = @() Get-ADGroup -Filter * | ForEach-Object( $groups[$_.DistinguishedName] = $_.Name ) Get-ADUser -Filter * -Properties MemberOf | ForEach-Object( $groupmap = $template.Clone() $_.MemberOf | ForEach-Object( $groups[$_] ) | Where-Object( $groupmap.ContainsKey($_) ) | ForEach-Object( $groupmap [$_] = $true ) 새 개체 - 유형 PSObject -Property $groupmap ) | 내보내기-Csv "C:\user_group_mapping.csv" -NoType

0

나는 한동안 이것을 가지고 놀았고 당신이 원하는 것을 정확히 얻을 수있는 방법을 찾은 것 같습니다.

나는 Ansgar가 올바른 길을 가고 있다고 생각하지만, 그 이후의 일을 할 수는 없었습니다. 그는 글을 쓰는 시점에는 AD 환경에 대한 액세스 권한이 없다고 언급했습니다.

내가 생각해낸 내용은 다음과 같습니다.

$UserArray = Get-Content "C:\Temp\Users.txt" $GroupArray = Get-Content "C:\Temp\Groups.txt" $OutputFile = "C:\Temp\Something.csv" # 해시테이블 설정 나중에 사용하려면 $UserHash = New-Object -TypeName System.Collections.Hashtable # UserHash에 사용자와 멤버십을 추가하는 외부 루프 $UserArray | ForEach-Object( $UserInfo = Get-ADUser $_ -Properties MemberOf # LPAP 구문을 그룹의 SAMAccountName으로만 제거 $Memberships = $UserInfo.MemberOf | ForEach-Object( ($_.Split(",")) .replace("CN=","") ) # 해시에 User=Membership 쌍 추가 $UserHash.Add($_,$Memberships) ) # 사용자별로 객체를 생성하는 외부 루프 $Results = $UserArray | ForEach-Object( # 먼저 간단한 개체를 만듭니다. $User = New-Object -TypeName PSCustomObject -Property @( Name = $_ ) # $GroupArray를 기반으로 개체에 멤버를 동적으로 추가합니다. $GroupArray | ForEach-Object ( #Checking $UserHash는 그룹이 사용자 멤버십 목록에 나타나는지 확인합니다. $UserIsMember = $UserHash.($User.Name) -contains $_ #객체에 속성 및 값 추가 $User | Add-Member -MemberType NoteProperty -Name $ _ -Value $UserIsMember ) # 개체를 변수로 반환 Return $User ) # 개체를 CSV로 변환한 후 출력 $Results |

모든 것이 이해되길 바랍니다. 최대한 댓글을 달았습니다. 이 제품을 실행 중인 컴퓨터에 RSAT가 설치되어 있지 않으면 ADSI로 변환하는 것이 매우 쉽습니다. 필요한 경우 알려주시면 빠르게 변경해 드리겠습니다.

디렉터리 개체를 생성, 수정 및 삭제하는 데 사용됩니다. 사용자는 다음 명령을 사용할 수도 있습니다. 식별스키마를 확장하려면 Active Directory 사용자 및 그룹 정보를 다른 응용 프로그램이나 서비스로 내보내고 ADAM(Active Directory 응용 프로그램 모드) 서비스를 다른 디렉터리 서비스의 데이터로 채웁니다.

통사론

식별 [-나] [-에프 파일 이름] [-에스 서버 이름] [-씨 라인1 라인2] [-V] [-제이 ] [-티 포트 번호] [-디 DN_베이스] [-아르 자형 필터_LDAP] [-피 지역] [-엘 LDAP_속성_목록] [-영형 LDAP_속성_목록] [-g] [-중] [-N] [-케이] [-ㅏ ] [-비 ] [-? ]

옵션

-나 가져오기 모드를 지정합니다. 매개변수가 정의되지 않은 경우 기본적으로 내보내기 모드가 사용됩니다. -에프파일 이름 가져오기 또는 내보내기 파일의 이름을 지정합니다. -에스서버 이름 가져오기 또는 내보내기 작업을 수행해야 하는 컴퓨터를 지정합니다. 기본 프로그램 식별해당 컴퓨터에서 실행됩니다. 식별설치되었습니다. -씨라인1 라인2 모든 발생을 대체합니다. 라인1콘텐츠 라인2. 일반적으로 한 도메인에서 다른 도메인으로 데이터를 가져오고 내보내기를 수행하는 도메인의 고유 이름을 바꿔야 할 때 사용됩니다( 1호선), 도메인 이름 가져오기( 2호선). -V 세부 로깅 모드를 활성화합니다. -제이 로그 파일의 위치를 ​​지정합니다. 기본값은 현재 경로입니다. -티포트 번호 LDAP(Lightweight Directory Access Protocol) 포트 번호를 지정합니다. 기본 LDAP 포트는 389입니다. 글로벌 카탈로그 포트는 3268입니다. -디DN_베이스 데이터 내보내기를 위한 검색 기반 고유 이름을 지정합니다. -아르 자형LDAP 필터 데이터 내보내기를 위한 LDAP 검색 필터를 만듭니다. 예를 들어 다음 필터는 특정 중간 이름을 가진 모든 사용자를 내보냅니다. csvde -r (그리고(객체클래스=사용자)(sn=)) -피지역 검색 영역을 지정합니다. 검색 범위 매개변수는 다음과 같습니다. 베이스, 원레벨그리고 하위 트리. -엘LDAP_속성_목록 내보내기 요청 결과에 반환된 속성 목록을 지정합니다. 이 매개변수를 생략하면 모든 속성이 반환됩니다. -영형LDAP_속성_목록 내보내기 요청 결과에서 생략할 속성 목록을 지정합니다. 이 옵션은 일반적으로 Active Directory에서 개체를 내보낸 다음 다른 LDAP 호환 디렉터리로 가져올 때 사용됩니다. 다른 카탈로그에서 지원하지 않는 속성이 있는 경우 이 옵션을 사용하여 결과 집합에서 제외할 수 있습니다. -g 페이지 검색을 제거합니다. -중 다음과 같이 쓸 수 없는 속성을 생략합니다. 개체GUID그리고 객체SID. -N 이진 값 내보내기를 생략합니다. -케이 가져오기 작업 중 오류를 무시하고 처리를 계속합니다. 다음은 무시된 오류의 전체 목록입니다.

  • 개체가 이미 그룹의 구성원입니다.
  • 가져온 객체에 다른 속성이 없는 경우 객체 클래스 위반(지정된 객체 클래스가 존재하지 않음을 의미)
  • 개체가 이미 존재합니다.
  • 제한 위반;
  • 속성이나 값이 이미 존재합니다.
  • 그런 개체가 존재하지 않습니다.
-ㅏ고유_이름_비밀번호 지정된 명령을 사용하여 명령 실행을 지정합니다. 고유_이름_사용자_이름그리고 비밀번호 -비. -비사용자 이름 도메인 비밀번호 지정된 명령을 사용하여 실행할 명령을 지정합니다. 사용자 이름, 도메인 및 비밀번호. 기본적으로 명령은 현재 네트워크에 로그인되어 있는 사용자의 자격 증명을 사용하여 실행됩니다. 매개변수와 함께 사용할 수 없습니다. -ㅏ. -? 명령 메뉴를 표시합니다.

노트

  • 매개변수 포함 -씨상수를 사용할 수 있습니다 #schemaNamingContext그리고 #configurationNamingContext스키마 디렉터리 파티션과 구성 디렉터리 파티션의 고유 이름 대신.
  • 명령에 대한 가져오기 파일을 생성하는 경우 식별, 값을 사용 변경 유형가져오기 파일에 포함된 변경 사항 유형을 결정합니다. 가치 변경 유형아래 표에 나와 있습니다.

다음은 값을 사용하는 LDIF 형식의 LDAP 가져오기 파일의 예입니다. 추가하다:
DN: CN=selected_user,DC=도메인 이름
변경 유형: 추가하다
중국: selected_user
설명:파일 설명
객체클래스: 사용자
객체클래스: selected_user

반환된 객체의 식별 이름, 일반 이름, 이름, 성, 전화번호만 추출하려면 다음을 입력하십시오.
-엘 고유_이름, 중국, 이름, S.N. 전화
객체의 GUID(Globally Unique Identifier)를 제외하려면 다음을 입력하십시오.
-영형 언제_만들어졌는지, 언제_변경되었나요?, 개체_GUID

Microsoft가 PowerShell의 첫 번째 버전 이후 이를 주요 Windows 관리 도구로 만들려고 노력해 왔다는 것은 비밀이 아닙니다. 그리고 여러 가지 방법으로 효과가 있습니다! 오늘은 간단한 예를 사용하여 Active Directory 사용자 및 해당 특성에 대한 다양한 정보를 얻는 데 사용할 수 있는 PowerShell 기능을 보여 드리겠습니다.

메모. 이전에는 AD 사용자 계정의 속성에 대한 정보를 얻으려면 ADUC 콘솔(포함), 유틸리티 등 다양한 도구를 사용해야 했습니다. 도구 선택은 일반적으로 현재 수행 중인 작업과 관리자의 프로그래밍 능력에 따라 결정되었습니다.

PowerShell 2.0에는 Active Directory 작업을 위한 특수 모듈(Windows Server 2008 R2에 도입됨)이 도입되었습니다. 이 모듈의 cmdlet을 사용하면 AD 디렉터리 개체에 대해 다양한 조작을 수행할 수 있습니다. cmdlet은 Active Directory 도메인 사용자 및 해당 속성에 대한 정보를 얻는 데 사용됩니다. Get-ADUser. Get-ADUser cmdlet을 사용하여 AD에 있는 기존 사용자 계정의 모든 특성 값을 가져올 수 있습니다. 또한 다양한 선택 기준을 지정하고 도메인 사용자 및 해당 속성 목록을 생성할 수 있습니다.

이 예에서는 PowerShell Get-ADUser cmdlet을 사용하여 사용자의 암호가 마지막으로 변경된 시기와 만료되는 시기에 대한 정보를 검색하는 방법을 보여줍니다.

관리자 권한으로 Powershll 창을 실행하고 다음 명령을 사용하여 Active Directory 모듈을 가져옵니다.

가져오기 모듈 활성 디렉터리

조언. Windows Server 2012 이상에서는 PowerShell Active Directory 모듈이 기본적으로 활성화되어 있으므로 이 항목을 건너뛸 수 있습니다.

클라이언트 운영 체제(예: Windows 10)에서 Get-AdUser 명령이 작동하려면 적절한 버전의 RSAT를 설치하고 제어판에서 구성 요소를 활성화해야 합니다. Windows PowerShell용 Active Directory 모듈(원격 서버 관리 도구 -> 역할 관리 도구 -> AD DS 및 AD LDS 도구 -> AD DS 도구).

모든 Get-ADUser cmdlet 인수의 전체 목록은 다음과 같이 얻을 수 있습니다.

Get-ADUser 도움말

모든 도메인 계정 목록을 표시하려면 다음 명령을 실행합니다.

Get-ADUser -필터 *

반환된 목록의 형식은 사용하기 매우 편리하지 않으며 사용자 계정의 120개 이상의 특성 및 속성 중 일부 기본 10개만 표시됩니다(DN, SamAccountName, Name, UPN 등). 마지막 비밀번호 변경 시간에 대한 정보가 없습니다.

사용자 tuser의 사용 가능한 모든 속성에 대한 전체 정보를 표시하려면 다음 명령을 실행하십시오.

Get-ADUser -identity tuser -properties *

따라서 사용자 계정과 관련된 AD 사용자 속성 및 해당 값의 전체 목록이 표시됩니다. 다음으로 필요한 필드가 표시되도록 Get-ADUser cmdlet의 출력 형식을 지정하겠습니다. 우리는 다음과 같은 속성에 관심이 있습니다.

  • 비밀번호가 만료되었습니다
  • 비밀번호 마지막 설정
  • 비밀번호는 만료되지 않습니다.

다음 명령을 실행해 보겠습니다.

Get-ADUser tuser -속성 PasswordExpired, PasswordLastSet, PasswordNeverExpires

이제 사용자 데이터에는 비밀번호 변경 날짜와 만료 시간에 대한 정보가 포함됩니다. 보다 편리한 표 형식으로 정보를 제시해 보겠습니다.

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

특정 OU의 사용자 데이터를 표시하려면 매개변수를 사용합니다. 검색베이스:

Get-ADUser -SearchBase 'OU=Moscow,DC=winitpro,DC=loc' -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft 이름, PasswordExpired, PasswordLastSet, PasswordNeverExpires

명령 결과를 텍스트 파일로 내보낼 수 있습니다.

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

또는 향후 Excel로 편리하게 내보낼 수 있는 CSV 형식입니다(추가로 다음을 사용). 정렬 개체 PasswordLastSet 열을 기준으로 테이블을 정렬하고 조건도 추가해 보겠습니다. 어디– 사용자 이름에는 "Dmitry" 문자열이 포함되어야 합니다):

Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | where ($_.name –like “*Dmitry*”) | 정렬 개체 PasswordLastSet | 선택 개체 이름, PasswordExpired, PasswordLastSet, PasswordNeverExpires | 내보내기-csv -경로 c:\temp\user-password-expires-2015.csv

따라서 필요한 Active Directory 사용자 속성을 사용하여 테이블을 작성할 수 있습니다.

특정 특성을 기반으로 AD 사용자 계정 목록을 얻으려면 –Filter 매개 변수를 사용합니다. 이 매개 변수에 대한 인수로 특정 Active Directory 사용자 특성의 값을 지정할 수 있습니다. 그러면 Get-ADUser cmdlet이 필터 기준과 일치하는 사용자에게 적용됩니다.

이름이 Roman으로 시작하는 AD 사용자의 출력:

Get-ADUser -필터(이름 -예: "Roman*")

Get-ADUser -Filter(SamAccountName -like "*") | 측정 개체

AD의 모든 활성(차단되지 않은) 계정 목록:

Get-ADUser -Filter(활성화 -eq "True") | 선택 개체 SamAccountName,Name,Surname,GivenName | 형식-테이블

비밀번호가 만료된 계정 목록:

Get-ADUser -필터(활성화 -eq $True) -properties 비밀번호 만료됨 | 여기서($_.비밀번호가 만료됨)

이메일 주소가 있는 활성 계정 목록:

Get-ADUser -필터((mail -ne "null") -및 (활성화 -eq "true")) -속성 성,GivenName,mail | 선택 개체 이름, 성, 주어진 이름, 메일 | 형식-테이블

작업: 텍스트 파일(한 줄에 하나의 계정)에 저장된 계정 목록의 경우 AD에서 사용자의 전화번호를 가져와 해당 정보를 텍스트 csv 파일(Esxel로 쉽게 가져올 수 있음)에 업로드해야 합니다.

가져오기-Csv c:\ps\usernsme_list.csv | ForEach( Get-ADUser -identity $_.user -속성 이름, TelephoneNumber | 이름 선택, TelephoneNumber | 내보내기-CSV c:\ps\export_ad_list.csv -Append -Encoding UTF8 )

다음 예에서는 기업 주소록을 나중에 Outlook 또는 Mozilla Thunderbird로 가져올 수 있는 csv 파일로 다운로드할 수 있습니다.

Get-ADUser -필터((mail -ne "null") -및 (활성화 -eq "true")) -속성 성,GivenName,mail | 선택 개체 이름, 성, 주어진 이름, 메일 | 내보내기-Csv -NoTypeInformation -Encoding utf8 -delimiter "," $env:temp\mail_list.csv

지난 90일 동안 비밀번호를 변경하지 않은 사용자:

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

$user = Get-ADUser winadmin -속성 ThumbnailPhoto $user.thumbnailPhoto | Set-Content winadmin.jpg -인코딩 바이트

사용자 계정이 속한 그룹 목록

Get-AdUser winadmin -Properties memberof | 멤버 선택 -expandproperty 멤버



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: