2014-10-13 1 views
0

모듈 내에서 오류 처리와 관련된 이상한 문제가 있습니다. ISE 편집기에서 고급 기능을 복사하고 거기에서 실행하면 오류가보고되지 않습니다. 이것이 바람직한 행동이기 때문입니다. 그러나 동일한 함수를 모듈 파일 (Toolbox.ActiveDirectory.psm1)에 붙여 넣은 다음이 코드를 호출하면 변수 $Error이 채워집니다.PowerShell 모듈에서 오류 처리

왜 모듈 내의 오류 Get-ADTSProfileHC의 오류를보고하고 스크립트 창에서 오류를보고하는지 이해할 수 없습니다. 당신이 볼 수 있듯이 Catch 절의 마지막 오류를 지 웁니다 (이전 질문에서 DanL의 도움 덕분에).

콘솔이나 모듈의 오류 처리에는 차이가있는 것처럼 보입니다.

기능 :

Function Get-ADusersHC { 
[CmdletBinding(SupportsShouldProcess=$True)] 
Param(
    [Parameter(ValueFromPipelineByPropertyName=$true,ValueFromPipeline=$true,Position=0)] 
    [String[]] $OU 
) 

Begin { 
    Function Get-ADOUNameHC { 
     $CanonicalName = $_.CanonicalName 
     [System.Collections.ArrayList]$Pieces = $CanonicalName.split(“/”) 
     $Pieces.Remove($Pieces[-1]) 
     $OU = $Pieces -join '\' 
     $OU -replace ($Pieces[0],$Pieces[0].ToUpper()) 
    } 

    Function Get-ADManagerDisplayNameHC { 
     $m = Get-ADObject -Identity $_.manager -Properties displayName,cn 
     if($m.ObjectClass -eq "user") { $m.displayName } Else{ $m.cn } 
    } 

    Function Get-ADTSProfileHC { 

     [CmdletBinding()] 
     Param(
      [Parameter(Mandatory=$true,Position=0)] 
      [String] $DistinguishedName, 
      [parameter(Mandatory=$true,Position=1)] 
      [ValidateNotNullOrEmpty()] 
      [ValidateSet('UserProfile','AllowLogon','HomeDirectory','HomeDrive')] 
      [String]$Property 
     ) 

     Begin { 
      $User = [ADSI]"LDAP://$DistinguishedName" 
     } 

     Process { 
      Try { 
       Switch ($Property) { 
        'AllowLogon' {if ($($User.psbase.InvokeGet('allowLogon')) -eq '1'){$True}else{$False}} 
        'HomeDirectory' {$User.psbase.InvokeGet('TerminalServicesHomeDirectory')} 
        'HomeDrive'  {$User.psbase.InvokeGet('TerminalServicesHomeDrive')} 
        'UserProfile' {$User.psbase.InvokeGet('TerminalServicesProfilePath')} 
       } 
      } 
      Catch { 
       # When we receive an error, it means the field has never been used before and is blank 
       # this is due to an error in the AD (same problem with the Quest CmdLet), AllowLogon is 
       # always 'TRUE' but we don't set it because we can't read it sometimes so we write 'blanks' 
       Write-Output $null 
       $Error.Remove($Error[0]) 
      } 
     } 
    } 
} 

Process {  
    Foreach ($_ in $OU) { 
     Write-Verbose "Function Get-HCADusersNoManager > OU: $_" 
     Write-Verbose "Function Get-HCADusersNoManager > Manager field empty" 
     Get-ADUser -SearchBase $_ -Filter 'SAMAccountName -eq "shenn"' -Properties * | 
     #Get-ADUser -SearchBase $_ -Filter * -Properties * | 
     Foreach { 
      $Properties = ([Ordered] @{ 
        "Creation date" = $_.whenCreated; 
        "Display name" = $_.displayName; 
        "CN name" = $_.name; 
        "Last name" = $_.sn; 
        "First name" = $_.givenName; 
        "Logon name" = $_.sAMAccountName; 
        "Manager" = if($_.manager){Get-ADManagerDisplayNameHC}; 
        "Employee ID" = $_.EmployeeID; 
        "HeidelbergcCement Billing ID" = $_.extensionAttribute8 
        "Type of account" = $_.employeeType; 
        "OU" = Get-ADOUNameHC; 
        "Notes" = $_.info -replace "`n"," "; 
        "E-mail" = $_.EmailAddress; 
        "Logon script" = $_.scriptPath; 
        "TS User Profile" = Get-ADTSProfileHC $_.DistinguishedName 'UserProfile'; 
        "TS Home directory" = Get-ADTSProfileHC $_.DistinguishedName 'HomeDirectory'; 
        "TS Home drive" = Get-ADTSProfileHC $_.DistinguishedName 'HomeDrive'; 
        "TS Allow logon" = Get-ADTSProfileHC $_.DistinguishedName 'AllowLogon' 
        }) 
      $Object = New-Object -TypeName PSObject -Property $Properties 
      Write-Output $Object 
     } 
    } 
} 

}

오류 :

Exception calling "InvokeGet" with "1" argument(s): "The directory property cannot be foun 
d in the cache. 
" 
At C:\Program Files\WindowsPowerShell\Modules\Toolbox.ActiveDirectory\Toolbox.ActiveDirect 
ory.psm1:299 char:42 
+       'UserProfile' {$User.psbase.InvokeGet('TerminalService ... 
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodTargetInvocation 

답변

0

나는 마이크로 소프트 엔지니어에서 StackOverflow의 다른 post에 대한 답 감사를 발견했다. 모듈의 변수 $ErrorGlobal 범위에서 변경해야합니다.

$Global:Error.Remove($Global:Error[0]) 
:

짧은에서

, 나는에 $Error.Remove($Error[0])을 변경했다