2014-10-08 1 views
0

저는 로컬 계정 이름을 변경하기 위해 PowerShell 스크립트를 사용하고 있습니다. 물론 첫 번째 단계는 계정이 있는지 확인하는 것입니다.ADSI의 오류 처리

$user=[ADSI]"WinNT://$server/$oldName,user" 

계정에 문제가 없으면 문제가 없습니다.

format-default : The following exception occurred while retrieving member >"distinguishedName": "The user name could not be found." + CategoryInfo : NotSpecified: (:) [format-default], ExtendedTypeSystemException + FullyQualifiedErrorId : CatchFromBaseGetMember,Microsoft.PowerShell.Commands.FormatDefaultCommand

나는 그 오류를 찾아 "$ oldname을 찾을 수 없습니다"와 같은 무언가를보고하고 계속하는 방법을 알아낼 수 없습니다 : 그렇지 않은 경우에, 나는이 오류가 발생합니다. 내가 말할 수있는 것부터, 오류 변수에 던지지 않는 것이므로 "사용자 이름을 찾을 수 없습니다"문자열을 검색 할 수 없습니다. Try-Catch-Finally는 오류를 무시하는 것처럼 보입니다.

나는 오류 처리에 약하다고 인정합니다. 무언가가 실패 할 수있는 수많은 방법이 있으며 내 사용자는 스크립트를 사용할 때 항상 새로운 스크립트를 찾습니다.

+0

내가 도움이 될 수있는 링크 된 질문에 대한 답변을 추가했습니다. https://stackoverflow.com/questions/43145567/powershell-directoryservice-object-error-not-catched-neither-trapped/43617003 –

답변

1

명령에서 실제로 종료 오류가 발생하는 것처럼 보입니다. 은 about_Preference_Variables

에서 "어느 $의 ErrorActionPreference이나 ErrorAction 일반 매개 변수 에서는 Windows PowerShell에서 종료 오류 (cmdlet은 처리를 중지하는 )에 반응하는 방식에 영향을줍니다."

그래서 명령이 실행되면 catch 블록을 시도하고 처리하기 위해 이동하기 전에 스크립트를 종료합니다.

흥미롭게도 변수에 넣으면이 동작이 중지됩니다. 누군가가 더 나은 답을 얻었는지 궁금 할 것입니다. 그러나 볼 수있는 것에서의 해결책처럼 보입니다. 변수의 결과에 기반한 if 문이 될 것입니다.

$User = [ADSI]"WinNT://badserver/Name,user" 
If (! $User.Name) 
{ 
    Throw "Issue retrieving user" 
} 

#Rest of script can continue here 
+0

감사합니다. 노아 . 하지만 제 첫 번째 라인과 제 첫 번째 라인의 차이가 보이지 않습니다. –

+0

오류 상태를 처리하는 방법을 알고 싶다고 생각했습니다. 첫 번째 줄은 부적절합니다. 이것은 오류를 처리하는 방법을 보여 주며, 줄을 넣으면 똑같은 일을합니다. 테스트를하는 동안 방금 변경했습니다. –

+0

글쎄, 신경 쓰지 마라. $ user.name을 찾는 것은 그것이 전부였다. 고마워, 노아. –

0

당신은 사용자 이름이 방법

[ADSI]::Exists("WinNT://$Server/$UserName") 

그것은 부울 값을 반환에 있는지 여부를 확인할 수 있습니다. 사용자가 있으면 true이고, 그렇지 않으면 false입니다.

+0

PortableDevil 역시 작동합니다. $ Server와 $ UserName 사이의 백 슬래시 중 하나를 제거해야 작동한다는 점을 제외하고는 PortableDevil이 작동합니다. 감사. –