2014-12-26 5 views
0

첫 글자 w가 있고 'x'개의 숫자가 오는 이름을 필터링하려면 어떻게 필터합니까? 예를 들어Powershell에서 긴 목록 필터링하기

:

w34593 w44569a we5552 w01123 내가

$userIDs = Get-Aduser -filter {name -like "w3*" -or name -like "w4*"} -Properties * | Select name, SurName, DisplayName 

문제와 그들이 W1로 시작하는 경우 일부는 긴 얻을 수있다 오프 시작했습니다

w85532, W2 , w3, w0과 나는 바보로 길게 각 하나 또는 코드를 필터링하고 싶지 않습니다.

제안 사항? 각 이름은 일반적으로 6 ~ 7 자 길이이므로 나에게 도움이되는 범위가 있습니까? 내가 .length 시도했지만이 PowerShell을 내 버전 작동하지 않는 것

업데이트 :

$userIDs = Get-Aduser -filter {(name -gt "w30000*" -and name -lt "w99999*") -or (name -gt "we0000*" -and name -lt "we9999*") ` 
     -or (name -gt "cr0000*" -and name -lt "cr9999*") -or (name -gt "ac0000**" -and name -lt "ac9999*")` 
     -or (name -gt "cm0000*" -and name -lt "cm9999*") -or (name -gt "do0000*" -and name -lt "do9999*") ` 
     -or (name -gt "ec0000*" -and name -lt "ec9999*") -or (name -gt "ev0000*" -and name -lt "ev9999*") ` 
     -or (name -gt "fm0000*" -and name -lt "fm9999*") -or (name -gt "ia0000*" -and name -lt "ia9999*") ` 
     -or (name -gt "in0000*" -and name -lt "in9999*") -or (name -gt "le0000*" -and name -lt "le9999*") ` 
     -or (name -gt "md0000*" -and name -lt "md9999*") -or (name -gt "mk0000*" -and name -lt "mk9999*") ` 
     -or (name -gt "np0000*" -and name -lt "np9999*") -or (name -gt "pb0000*" -and name -lt "pb9999*") ` 
     -or (name -gt "ps0000*" -and name -lt "ps9999*") -or (name -gt "re0000*" -and name -lt "re9999*") ` 
     -or (name -gt "sf0000*" -and name -lt "sf9999*") -or (name -gt "so0000*" -and name -lt "so9999*") ` 
     -or (name -gt "tr0000*" -and name -lt "tr9999*") -or (name -gt "wn0000*" -and name -lt "wn9999*") } ` 
     -Properties * | Select name, SurName, DisplayName, enabled 

ERROR :

Get-ADUser : Error parsing query: '(name -gt "w30000*" -and name -lt "w99999*") 
-or (name -gt "we0000*" -and name -lt "we9999*") ` 
     -or (name -gt "cr0000*" -and name -lt "cr9999*") -or (name -gt "ac 
0000**" -and name -lt "ac9999*")` 
     -or (name -gt "cm0000*" -and name -lt "cm9999*") -or (name -gt "do 
0000*" -and name -lt "do9999*") ` 
     -or (name -gt "ec0000*" -and name -lt "ec9999*") -or (name -gt "ev 
0000*" -and name -lt "ev9999*") ` 
     -or (name -gt "fm0000*" -and name -lt "fm9999*") -or (name -gt "ia 
0000*" -and name -lt "ia9999*") ` 
     -or (name -gt "in0000*" -and name -lt "in9999*") -or (name -gt "le 
0000*" -and name -lt "le9999*") ` 
     -or (name -gt "md0000*" -and name -lt "md9999*") -or (name -gt "mk 
0000*" -and name -lt "mk9999*") ` 
     -or (name -gt "np0000*" -and name -lt "np9999*") -or (name -gt "pb 
0000*" -and name -lt "pb9999*") ` 
     -or (name -gt "ps0000*" -and name -lt "ps9999*") -or (name -gt "re 
0000*" -and name -lt "re9999*") ` 
     -or (name -gt "sf0000*" -and name -lt "sf9999*") -or (name -gt "so 
0000*" -and name -lt "so9999*") ` 
     -or (name -gt "tr0000*" -and name -lt "tr9999*") -or (name -gt "wn 
0000*" -and name -lt "wn9999*") ' Error Message: 'Operator Not supported: ' at 
position: '95'. 
At J:\DATA\IR\ITSecurity\Intern\AlyssaC 2014\Part-time 2014-2015 task\AD\AD cle 
an-up\Daily Script\AD-User.MonitorOwnership.ps1:3 char:22 
+ $userIDs = Get-Aduser <<<< -filter {(name -gt "w30000*" -and name -lt "w9999 
9*") -or (name -gt "we0000*" -and name -lt "we9999*") ` 
    + CategoryInfo   : ParserError: (:) [Get-ADUser], ADFilterParsingEx 
    ception 
+ FullyQualifiedErrorId : Error parsing query: '(name -gt "w30000*" -and n 
ame -lt "w99999*") -or (name -gt "we0000*" -and name -lt "we9999*") ` 
      -or (name -gt "cr0000*" -and name -lt "cr9999*") -or (name -g 
t "ac0000**" -and name -lt "ac9999*")` 
      -or (name -gt "cm0000*" -and name -lt "cm9999*") -or (name -g 
t "do0000*" -and name -lt "do9999*") ` 
      -or (name -gt "ec0000*" -and name -lt "ec9999*") -or (name -g 
t "ev0000*" -and name -lt "ev9999*") ` 
      -or (name -gt "fm0000*" -and name -lt "fm9999*") -or (name -g 
t "ia0000*" -and name -lt "ia9999*") ` 
      -or (name -gt "in0000*" -and name -lt "in9999*") -or (name -g 
t "le0000*" -and name -lt "le9999*") ` 
       -or (name -gt "md0000*" -and name -lt "md9999*") -or (name -g 
t "mk0000*" -and name -lt "mk9999*") ` 
      -or (name -gt "np0000*" -and name -lt "np9999*") -or (name -g 
t "pb0000*" -and name -lt "pb9999*") ` 
      -or (name -gt "ps0000*" -and name -lt "ps9999*") -or (name -g 
t "re0000*" -and name -lt "re9999*") ` 
      -or (name -gt "sf0000*" -and name -lt "sf9999*") -or (name -g 
t "so0000*" -and name -lt "so9999*") ` 
      -or (name -gt "tr0000*" -and name -lt "tr9999*") -or (name -g 
t "wn0000*" -and name -lt "wn9999*") ' Error Message: 'Operator Not suppor 
ted: ' at position: '95'.,Microsoft.ActiveDirectory.Management.Commands.Ge 
tADUser 

업데이트 2 : 내가 개별적으로 각각했던이 시간과 그들은 일 했어???? 그들은 개별적으로

그들 중 일부 필터링하지 않는 한 내 주요 필터가 작동하지 않는 이유를 이해가 안 : 오류없이 제대로

$wIDs = Get-Aduser -filter {(name -gt "w30000*" -and name -lt "w99999*")} -Properties * | Select name, SurName, DisplayName, enabled 
$weIDs = Get-Aduser -filter {(name -gt "we0000*" -and name -lt "we9999*")} -Properties * | Select name, SurName, DisplayName, enabled 

foreach ($user in $wIDs) { 

if ($user.DisplayName -like "*-DISABLED"){ 

#$groups = get-Adgroup -properties managedby -filter {managedby -eq $user.name} 

write-host "User ID: " $user.name 
write-host "Last Name: " $user.SurName 
write-host "Display Name: " $user.DisplayName 

write-host $break1 "Next User:" $break1 
}#end of if statement 

}#end foreach 

foreach ($user in $weIDs) { 

if ($user.DisplayName -like "*-DISABLED"){ 

#$groups = get-Adgroup -properties managedby -filter {managedby -eq $user.name} 

write-host "User ID: " $user.name 
write-host "Last Name: " $user.SurName 
write-host "Display Name: " $user.DisplayName 
#write-host "Managed Groups: " $groups 

write-host $break1 "Next User:" $break1 
}#end of if statement 

}#end foreach 

이 인쇄 ????

+0

w ID는 작동하지만 나머지는 표시되지 않습니다. 나는이 거대한 오류를 얻는다 – narue1992

+0

나는 *을 삭제했다. 그리고 그 오류는 여전히있다. 나는 내 업데이트를 다시 보여줄 것이다. 이번에 나는 개별적으로 각각을 필터링했다. (매우 나쁘다. 내 스크립트는 매우 길지만, 나는 모두 작동한다. 개별적으로 내 주 필터의 내용이 잘못되어 있음) – narue1992

답변

2

은 모든 사용자 개체를 반환하지 않으므로 성능상의 이유로는 -Filter을 사용하는 것이 좋습니다. 그러나이 경우 사실을 기반으로 한 정규 표현식이이 문제에 더 적합 할 수 있다는 조건부 기준 때문에 생각합니다. 따라서 1000 명의 사용자가 10 명이 아니라면 정상적으로 작동합니다. 또한 모두 사용자 속성을 보유하고 있지만 그 중 4 개만 가져 오는 중입니다. 그 자체로 성능이 저하 될 것입니다. 기본값이 아닌 유일한 것은 Enabled이므로 우리는 이것을 반드시 수행 할 것입니다. 이름이 두 글자 *합니다 (w30000 기준의 그룹 중 하나로 시작해야합니다 경우 기본적으로 정규식 일치하는 문자열을 구축

$prefixes = "cr","cm","ec","fm","in","md","np","ps","sf","tr","ac","do","ev","ia","le","mk","pb","re","so","wn","we","w[3-9]" 
$regex = "^($($prefixes -Join "|"))\d*" 
$results = Get-ADUser -Filter * -Properties Enabled,DisplayName | 
    Where-Object{$_.Name -match $regex} | 
    Select Name,SurName,DisplayName,Enabled 
$results 

그래서 마지막에 당신이 승 "을 의미 w[3-9]를 볼 이유가 다른 것보다 다른 "다음에"3에서 9 "까지의 숫자가 이어짐) 몇 개의 숫자가 이어집니다. 문자열은 사용자가 원하는대로 추가하고 제거 할 수있는 $prefixes 배열로 만들어집니다.

정확한 기준에 맞지 않지만 일치하는 항목에 따라 쉽게 변경할 수 있습니다. -lt, -gt 등은 와일드 카드를 지원하지 않습니다. 문자 그대로 별표 문자로 취급한다고 생각하십시오. -like-notlike은 와일드 카드를 지원합니다.

다른 2 자의 접두사가있는 계정이 있습니까? 그렇지 않은 경우 ^\w{2}\d+과 같이 매우 간단한 정규식을 사용하여 2 자 이상으로 적어도 하나의 숫자가 올 수 있습니다.

+0

그런 디테일과 설명에 감사드립니다. 나는 전에 \ d + 코드를 본 적이 없다. 나는 그것이 어떻게 작동했는지에 대한 느낌을 얻기 위해 예제를 인쇄 해 보았지만 아무 일도 일어나지 않았습니다. 나는 또한 접두사 변수가 나를 위해 작동하지 않을 것이라고 생각합니다 cr1.cm 등으로 시작하지만 숫자가없는 다른 ID도 있습니다. 음 ... – narue1992

+0

''+ '를'*'로 변경하여 "cm"과 "ec0000"이 일치하도록했습니다. 일치하는 다른 이름의 예를 보여줄 수 있습니까? 또한 실제 이름 또는 samaccountnames입니까? @AlyssaCooke – Matt

+0

(fm : fmsad) in : install99, install .... ev : evaltes ... 등등. 이것들은 실제 이름이기도합니다. – narue1992

2

이 기능이 유용합니까?

Get-Aduser -filter {name -gt "w3000" -and name -lt "w9999"} 

편집 :

을 감안할 때 새로운 요구 사항 : 당신이 접두사 일치하는 이름을 가진 다만 계정을 반환하는 초기 필터링을 사용하게됩니다

$prefixes = "cr","cm","ec","fm","in","md","np","ps","sf","tr","ac","do","ev","ia","le","mk","pb","re","so","wn","we" 

#Create filter for searches 
$DNFilters = $prefixes -replace '^','(Name=' -replace '$','*)' 
$Filter = "(|$DNFilters)" 


Get-ADUser -LDAPFilter $Filter -Properties Enabled | 
Where-Object {$_.name -like '??[0-9][0-9][0-9][0-9]'} 

. 그런 다음 늦은 필터 (Where-Object)은 다음 4 자리가없는 필터를 필터링합니다.

편집 : 이 줄 :

$DNFilters = $prefixes -replace '^','(Name=' -replace '$','*)' 

각 접두사를 받아, 문자열 '(Name='을 사전에 의해 좌우 한 다음에 문자열 '*)'을 추가합니다. 결과는 예를 들어 접두사 'cr'은 '(Name=cr*)'이됩니다. 그것은 'cr'로 시작하는 모든 이름의 LDAP 필터입니다.

그런 다음이 라인 :

$Filter = "(|$DNFilters)" 

이 사람들을 감싸는 '(|'와 ')'. '|' LDAP 필터에서 'OR'을 의미합니다. 결과 필터는 다음과 같습니다

(|(Name=cr*) (Name=cm*) (Name=ec*) (Name=fm*) (Name=in*) (Name=md*) (Name=np*) (Name=ps*) (Name=sf*) (Name=tr*) (Name=ac*) (Name=do*) (Name=ev*) (Name=ia*) (Name=le*) (Name=mk*) (Name=pb*) (Name=re*) (Name=so*) (Name=wn*) (Name=we*)) 

개별 LDAP 필터 모두가 하나 개의 필터에 함께 OR입니다.이 라인에서

:

Where-Object {$_.name -like '??[0-9][0-9][0-9][0-9]'} 

?? 수단 "두 문자". 와일드 카드 일치 (-like)의 경우 ?은 "모든 단일 문자"를 의미합니다.

+0

매우 느리게 실행되어 다시 시작해야하는 경향이 있습니다./wow – narue1992

+0

그래도 실수로 -and를 변경하지 않았고 -lt 대신 -le을 사용했습니다. 그것은 작동 .. 감사합니다! – narue1992

+0

오류가 발생했습니다. 나는 그것 때문에 gt의 이유는 단지 숫자에 대한 것이라고 생각한다. – narue1992