Get-Aduser - 필터가 변수를 허용하지 않습니다.
시스템에 사용자 계정이 이미 있는지 확인하고 싶습니다.
$SamAc = Read-Host 'What is your username?'
$User = Get-ADUser -Filter {sAMAccountName -eq "$SamAc"}
왜$User을 반환하는 null을 합니다.{sAMAccountName -eq "$SamAc"}사실이어야 합니다.
내가 여기서 뭘 놓쳤지요?
편집:
다음은 누락된 내용입니다.
$User = Get-ADUser -Filter "sAMAccountName -eq '$SamAc'"
편집자 참고 사항:스크립트 블록({ ... })가 문자열로 대체되었습니다.
기존 답변에 귀중한 정보가 있지만 좀 더 집중적인 요약이 도움이 된다고 생각합니다.이 답변의 원래 형태는 스크립트 블록의 엄격한 회피를 주장했습니다.{...}) 및 AD 공급자 변수 평가가 더 미묘한 권장 사항으로 대체되었습니다.
옵션 A: AD 공급자의 확인 허용 - 독립 실행형만 - 변수 참조:
Get-ADUser -Filter 'sAMAccountName -eq $SamAc' # note the '...' quoting
문자열의 값은 그대로 AD 공급자(cmdlet)에게 전달되어야 하기 때문에 verbatim(단일 따옴표로 묶인) 문자열을 사용합니다.
- 블록을 (스크립트블동안는사하용록을(동안▁while▁(▁use스)
{ ... }),Get-ADUser -Filter { sAMAccountName -eq $SamAc }기술적으로도 작동합니다(말 그대로의 내용, 산스).{그리고.}는 문자열로 변환됨), 개념적으로 문제가 있습니다. 아래 섹션을 참조하십시오.
- 블록을 (스크립트블동안는사하용록을(동안▁while▁(▁use스)
변수 참조()
를 따옴표로 묶지 마십시오."$SamAc"독립 실행형 변수 참조만 사용(예:
$SamAc특히 속성 액세스를 포함한 식은 지원되지 않습니다(예: 지원되지 않음).$user.SamAccountName또는"$name*"또는$("admin_" + $SamAc)필요한 경우 중간 보조 변수를 사용합니다. 예:$sam = $user.SamAccountName; Get-ADUser -Filter 'sAMAccountName -eq $sam'
일반적으로 PowerShell 연산자의 일부만 지원되며, 연산자가 항상 동일한 방식으로 작동하는 것은 아닙니다. 아래 섹션을 참조하십시오.
주의: 사용하는 경우
Get-ADUserPowerShell v7+에서 Windows 호환성 기능을 통해 자체적으로 생성되었는지 여부에 관계없이 암시적으로 원격 모듈을 통해 생성되었는지 여부'...'도 아니다{ ... }변수 참조가 원격 시스템에서 평가되기 때문에 변수를 찾는 것이 효과적입니다. (허무합니다.)(Get-Command Get-ADUser).CommandType아온다를 합니다.Function암시적으로 원격 모듈을 사용하고 있습니다.- 암시적 원격이 포함된 경우 다음과 같이 문자열 보간을 사용해야 합니다.
옵션 B: PowerShell의 문자열 보간(확장 가능한 문자열) 사용, 맨 앞:
Get-ADUser -Filter "sAMAccountName -eq `"$SamAc`"" # note the "..." quoting
확장 가능(이중 따옴표로 묶은) 문자열을 사용하면 PowerShell이 모든 변수 참조 및 하위 표현식을 사전에 보간(확장)할 수 있으며, 이 경우 AD 공급자는 (변수 없음) 결과만 볼 수 있습니다.
위에 표시된 것처럼 문자열 피연산자가 포함된 경우 견적이 필요합니다.
- 인용의 내장된견적경우의,,
'...'에 대한 보다 간단한 대안입니다.`"...`"(`"는 _escaped는filename _입니다다▁_입니다."), 된 값 ), 를 포함하지'예를 들어, 성이 확실한 가능성이 있습니다.
- 인용의 내장된견적경우의,,
또한 다음과 같은 상수를 이스케이프해야 합니다.
$true,$false,그리고.$null에의 에."..."문자열은 항상 AD 공급자가 인식합니다. 즉, PowerShell이 사전에 확장하지 않도록 , 및 를 사용합니다.주의: 확장 가능한 문자열을 사용하는 것이 모든 데이터 유형에서 작동하지는 않습니다. 예를 들어 인스턴스의 기본 문자열 지정(예:
01/15/2018 16:00:00AD 공급자가 인식하지 못합니다. 이 경우 인스턴스(또는 ?) 메서드에 대한 호출 결과를 문자열에 포함시켜야 할 수 있습니다(이 게시물에 대한 의견에서 제안된 바와 같이).비슷한 해결 방법이 필요한 다른 데이터 유형이 있는지 잘 모르겠습니다.긍정적인 측면에서 문자열 보간을 사용하면 전체 식을 포함하고 명령어를 포함할 수 있습니다.
"..."문열, 용사 사용$(...)하위 표현식 연산자(예:# Property access. Get-ADUser -Filter "sAMAccountName -eq `"$($user.SamAccountName)`"" # String concatenation Get-ADUser -Filter "sAMAccountName -eq `"$('admin_' + $SamAc)`""
배경
전달된 모든 인수는 문자열에 먼저 강제로 전달됩니다.
Get-ADUser는 cmdlet 때문입니다.-Filter가 매개 변가 유다니입형수 유형입니다.[string]이 매개 변수를 지원하는 모든 공급자 cmdlet에 대해 동일한 상태로, 를 사용하여 확인합니다.Get-ADUser -?일반적으로 PowerShell과 공통점이 거의 없는 도메인별(쿼리) 언어를 사용하여 해당 문자열을 해석하는 것은 cmdlet(기본 PowerShell 제공자)에게 달려 있습니다.
의
Get-ADUser도메인별 언어(언어)는 에 문서화되어 있습니다.- 참고: 이 문서에서는 이 레거시 항목의 최신 버전이 없습니다. 이 GitHub 문제에서는 이 항목을 요청합니다.
에서 지원되는 언어는 확실히 PowerShell을 모델로 하고 있지만 다음과 같이 많은 제한 사항과 몇 가지 동작 차이가 있습니다.
Santiago Squarzon이 지적했듯이, 이러한 제한과 차이점은 언어가 백그라운드에서 LDAP 필터로 변환되기 때문에 기능과 동작에 의해 제한됩니다.
-LDAPFilter개변수 대신-FilterLDAP 필터를 직접 전달합니다.일부 PowerShell 운영자만 지원되며 일부 운영자는 다른 동작을 보입니다. 다음은 완전하지 않은 목록입니다.
-like/-notlike만 합니다.*(""("▁also와아"))으로 표시됩니다.?집합집합(문자 집합/문자 집합)[...])'*'값 자체는 비어 있지 않은 값을 나타냅니다(PowerShell의 와일드카드 식과 달리 빈 값과도 일치합니다).- 에 에.
-eq ""또는-eq $null있는지 를 합니다.
-notlike '*'. - 필드 "AD"):
DistinguishedName유일한 지지'*'그 자체로, 더 큰 패턴의 일부가 아닙니다. 즉, 빈 테스트만 지원합니다.
- 정규식 일치를 지원하지 않습니다.
-lt/-le그리고.-gt/-ge어휘 비교만 수행합니다.- 않거나 하면 존하지않잘속된이참면조가 합니다.
Get-ADUser반환하라는 명령$null.
언급된 바와 같이 독립형 변수 참조만 지원됩니다(예:
$SamAc), 표현식(예:$SamAc.Name또는$("admin_" + $SamAc))
스크립트 블록을 사용할 수 있는 동안(
{ ... }) 을 문열이것에전달니다로-Filter이 구문은 따옴표를 포함하는 데 편리할 수 있지만 다음 두 가지 이유로 문제가 있습니다.PowerShell 코드 일부를 전달하고 있다고 착각할 수 있습니다. 특히 단순한 변수 참조가 아닌 지원되지 않는 연산자와 식을 사용하려고 할 수 있습니다.
PowerShell이 먼저 필터를 PowerShell 코드로 구문 분석하도록 강제하고 인수가 다음과 같이 바인딩된 경우에만 결과를 문자열로 다시 변환하도록 하기 때문에 불필요한 작업이 발생합니다(실제로는 문제가 되지 않을 것 같지만).
-Filter.
이것은 제가 Active Directory 모듈을 사용하기 시작했을 때 저를 괴롭혔고, 그것을 이해하는 것은 고통이었습니다.
그-FilterActive Directory 모듈 cmdlet에 대한 매개 변수가 실제로 문자열을 찾고 있습니다.을 할 때는.{sAMAccountName -eq "$SamAc"}그 가치로서, 그것은 실제로 찾고 있습니다."sAMAccountName -eq ""`$SamAc"""
기본적으로 Powershell은 매개 변수를 구문 분석하고 해당 값을 문자열로 변환하며 변수를 보간하지 않습니다.미리 끈을 만들어 보면 효과가 있을 겁니다.
이와 같은 것:
$SamAc = Read-Host 'What is your username?'
$filter = "sAmAccountname -eq ""$SamAc"""
$User = Get-ADUser -Filter $filter
저는 이것을 정리하는 것이 정말 저를 화나게 했기 때문에 이것에 대해 논평해야 합니다.
조셉 알콘의 생각은 옳습니다.필터 매개 변수는 문자열을 사용한 다음 필터를 처리하기 위해 문자열을 평가합니다.사람들을 놀라게 하는 것은 {} 대신에 괄호를 사용할 수 있는 옵션이 주어졌다는 것입니다. 그러나 이 옵션은 Where...를 사용할 때 예상했던 것처럼 작동하지 않습니다.여전히 끈처럼 다루어야 합니다.
$SamAc = Read-Host 'What is your username?'
$User = Get-ADUser -Filter "sAMAccountName -eq '$SamAc'"
자신과 다른 사용자가 보다 명확하게/읽을 수 있도록 하고 잠재적인 구문 오류를 방지하거나 파이프라인에서 Where{}(으)로 이동하는 것이 좋습니다.이렇게 할 때는 변수에 대한 지능형 탐지가 가능하도록 외부에는 이중 따옴표를 사용하고 내부에는 단일 따옴표를 사용하는 것이 가장 좋습니다.
변수 주위의 따옴표를 제거하기만 하면 됩니다.
$SamAc = Read-Host 'What is your username?'
$User = Get-ADUser -Filter {sAMAccountName -eq $SamAc}
이것은 잘 작동할 것입니다.
if (($ADUser = Get-ADUser -filter "SamAccountName -eq '$(Read-Host Username)'") -ne $null) {$ADUser.SamAccountName} else {"Not Found"}
나 같은 사람이 여기 와서 아직도 머리를 쥐어뜯고 있다면 작은 부록.
-properties *
이 쿼리에 이 기능이 있는 것은 매우 일반적입니다.안 돼요, 저보다 똑똑한 사람이 해결할 수 있을 거예요
-속성 mail,cn,cf
등은 예상대로 작동합니다.
그냥 사용하는 데 꽤 많은 시간이 걸렸습니다.
변수 참조("$SamAc")를 따옴표로 묶지 마십시오.
TXH 너무 많이
좋아요, 저는 마침내 다음 구문과 위의 예제를 사용하여 작업할 수 있게 되었습니다.
이전 버전:
$User = Get-ADUser -Filter "sAMAccountName -eq '$SamAc'"
작업 버전:
$user = Get-aduser -Filter "sAMAccountName -eq '$($SamAc)'"
PowerShell이 변수 문자열 값에 액세스하기 전에 $($)를 $SamAc에 추가해야 했습니다.
언급URL : https://stackoverflow.com/questions/20075502/get-aduser-filter-will-not-accept-a-variable
'source' 카테고리의 다른 글
| SQL Server의 Excel 저장 프로시저의 표와 워크북의 매개 변수 필드 (0) | 2023.08.28 |
|---|---|
| Django가 Docker를 사용하여 MariaDB 인스턴스에 연결할 수 없습니다. (0) | 2023.08.28 |
| 라라벨 웅변가 연산자 간의 사용 방법 (0) | 2023.08.08 |
| pl/sql 프로그래머들이 돈 계산으로 흔히 저지르는 실수는 무엇입니까? (0) | 2023.08.08 |
| 모든 파일에 대해 --ours/--theirs를 사용하여 충돌 해결 (0) | 2023.08.08 |