2016-08-01 2 views
0

데이터베이스와 Active Directory간에 데이터를 정리해야합니다. 전체 아키텍처를 더 간단하게 만들기 위해 데이터베이스에서 그룹 및 구성원 목록을 가지고 있다고 가정 해 보겠습니다.그룹에서 사용자 목록 제거 특정 항목에 대해 자동으로 실패 함

광고에도 그룹이 있지만이 그룹의 구성원 자격을 데이터베이스의 정리와 동일하게 정리해야합니다.

내 데이터베이스의 구성원 목록을 내 AD 그룹의 구성원 목록과 비교 한 다음 차등을 만들어 AD 그룹에서 제거해야하는 계정과 어떤 계정을 제거해야 하는지를 알 수 있습니다 그룹에 추가해야합니다.

내 전체 환경에있는 사용자의 볼륨이 상당히 커서 대기 시간 문제가 발생할 수 있습니다. 차동의 치료 기간 동안, 스크립트가 오류로 인해 실패 :

Microsoft.ActiveDirectory.Management.ADException : The specified account name is not a member of the group 

는 스크립트의 지속 시간에, 일부 작업은 AD 데이터베이스에 계속 실행 것으로 나타났다 디버깅 후, 및 멤버를 제거 그 차이가 확립 된 후 해당 그룹에서 스크립트를 실행하여 오류를 일으키는 그룹 구성원을 다시 제거하려고합니다. 사용자의 양 때문에 차등과 치료 종료 사이의 시간은 수 시간이 걸릴 수 있습니다.

명령이 다음과 같이 서식이 지정되면이 항목과이 항목에 대해서만 자동으로 실패하고 사용자 목록을 계속 처리 할 수 ​​있습니까? 처리 시간이 기하 급수적으로 더 높을 것이기 때문에

Remove-ADGroupMember -Identity $group -Member $users -Server $ADServer -Credential $creds -Confirm:$false 

우리는 현실적으로 차이를 업데이트 할 각 작업 사이에 그룹의 구성원을 확인할 수 없습니다.

또한 관련 질문은 계정에 광고가 더 이상 존재하지 않을 때 침묵하는 실패한 작업입니까?

답변

1

에 코드를 포장해야 그들, 또는 없음 (모든 경우 예 오류에 대한 발생합니다). 존재하지 않는 사용자를 무시하려면 각 회원을 개별적으로 삭제해야합니다. 나는이 테스트는 Windows 2008 R2 DC에 내가 $ErrorActionPreference을 설정해야한다고

$ErrorActionPreference = 'SilentlyContinue' 
$users | ForEach-Object { 
    Remove-ADGroupMember -Identity $group -Members $_ 
} 

참고 :이있다. 매개 변수 -ErrorAction SilentlyContinueRemove-ADGroupMember에 추가하지 못했습니다.

$members = Get-ADGroupMember -Identity $group | 
      Select-Object -Expand SamAccountName | 
      Where-Object { $users -contains $_ } 

Remove-ADGroupMember -Identity $group -Members $members -Confirm:$false 
+0

이것이 나의 가장 큰 문제에 대한 해답이지만 성능에 대해서는 잘 모르겠습니다. 70k 그룹에서 300,000 명이 넘는 사용자가 있습니다. 지금 사용하고있는 일괄 처리 명령과 솔루션의 시간차에 대해 알고 계십니까? 나는 작업 당 하나의 명령을 보내는 것이 상당히 느릴 것이라고 상상한다. 현재 스크립트는 실행하는 데 최대 4 일이 걸렸으므로 스크립트를 실행하지 않고 벤치마킹 할 수있는 정보를 제공 할 수 있다면 매우 감사 할 것입니다 (특히 수정 후 몇 주 동안 실행하는 경우) . –

+0

기본적으로 두 가지 옵션이 있습니다. a) 멤버가 있는지 확인한 다음 한 번의 호출로 멤버를 제거하거나 b) 오류를 무시하면서 한 번에 한 멤버를 제거합니다. 골라보세요. –

+0

부록 : 변경 목록을 DC로 보내고 모든 명령을 원격으로 호출하는 대신 로컬로 명령을 실행하여 성능을 향상시킬 수 있습니다. –

0

모든 기본 제공 cmdlet powershell은 오류가 발생할 때 발생하는 상황을 제어 할 수있는 일부 Powershell common parameters을 제공합니다. 내가 강하게 광고 cmdlet을 내장 사용하는 것이 좋습니다 것

remove-adgroupmember -identity something -members something -erroraction silentlycontinue 

과 :에

는 경우에 당신이 원하는 것입니다. 그런 다음 그룹 구성원을 제거하기 위해 자신의 기능을 사용하는 경우에 당신은 당신이 중 하나를 제거 Remove-ADGroupMember에 그룹 구성원 목록을 전달할 경우 try catch block

+0

내가 실제 PowerShell을 cmdlet을 반영하기 위해 내 질문에 편집 :

당신이 다른 옵션은 첫 번째 그룹 구성원을 열거하고 있는지 만을 제거하는 것입니다.나는 또한 -erroraction을 사용하여 silentlycontinue를 사용하면 스크립트를 계속 진행할 수 있지만 여전히 실패한 항목에서 실제 명령을 중지한다는 인상하에있었습니다. 내가 잘못 ? –

+0

이론상'silentlycontinue'는 정확히 항목의 목록을 처리하는 작업을 수행해야합니다. 오류가 발생하면 오류를 무시하고 목록의 다음 항목 처리로 이동합니다. 그러나 정확히 테스트하지는 않았습니다 ... 어쨌든 대답은 아마도 아래에 @ansgar에 의해 게시 된 당신을 위해 작동합니다. – Kiran

+0

@Kiran Failed 문에 실패했습니다. 'SilentlyContinue'는 스크립트가 다음 명령문으로 진행하도록합니다. 현재 문장이 부분적으로 실패하지는 않습니다. –

관련 문제