2014-09-19 5 views
3

Je cours Powershell V2 sur XP: Cela fait partie d'un plus grand script et je remarque quelques anomolies avec la façon dont je suis capable d'utiliser des objets de référence pour mettre à jour le objet "maître". Cela a commencé comme un moyen d'éviter de taper le nom compliqué de la propriété à chaque fois - je pourrais facilement étendre le nom complet, mais maintenant la raison de ce comportement me perturbe sérieusement.Powershell [Ref] Valeur ne mettant pas à jour l'objet principal

[CmdletBinding()] 
Param() 
Function Breakhere {Write-Verbose " "} 
Set-PSBreakpoint -Command Breakhere 
$Data = @" 
UserID 
MyUser1 
MyUser2 
User3 
"@ 
$Data = $Data|ConvertFrom-Csv 

$Domains = "DomainA","DomainB" 

$Props = "ParentContainer","AccountIsDisabled","employeeNumber" 
$Connection = New-Object HashTable 

ForEach ($Domain in $Domains) 
{ 
    Write-Verbose "Current Domain: $Domain" 
    # Add necessary headers to main data 
    $text1 = "$($Domain)_ADObject" 
    $text2 = "$($Domain)_Confidence" 
    $Data = $Data |Select *,$text1 
    $Data = $Data |Select *,$text2 

    #Bind to each domain and save the connection contexts into a hashtable 
    Write-Verbose "Binding to $Domain" 
    $Connection.Add($Domain,(Connect-QADService -service $Domain)) 
} 

ForEach ($User in $Data) 
{ 
    ForEach ($Domain in $Domains) 
    { 
     $User."$($Domain)_ADObject" = Get-QADUser -Connection $Connection[$Domain] -SamAccountName $User.UserID -DontUseDefaultIncludedProperties -IncludedProperties $Props|Select $Props 

     # Referencing the confidence parameter does not seem to work. 
     $CF = [ref]$User."$($Domain)_Confidence" 
     # Weirdly, this one does work. 
     $AD = [ref]$User."$($Domain)_ADObject" 

     If ($AD.Value) 
     { 
      $CF.Value = 1 
      Breakhere # Break here and allow for opportunity to inspect $user and $CF objects 

      If ($AD.Value.AccountIsDisabled) 
      { 
       Write-Verbose "$Domain\$($User.UserID): Account Disabled" 
       $CF.Value *= 0.8 
      } 
     } 
     Else 
     { 
      Write-Verbose "$Domain\$($User.UserID): No AD Object found" 
      $CF.Value = 0 
     } 
    } 
} #End ForEach $UserID 

Au point d'arrêt, si je $ query utilisateur, je reçois quelque chose de semblable à ce qui suit:

UserID    : MyUser1 
DomainA_ADObject : @{ParentContainer=DomainA/Users; AccountIsDisabled=False; employeeNumber=123456} 
DomainA_Confidence : 
DomainB_ADObject : 
DomainB_Confidence : 

Toutes les bonnes. Dois-je le souhaite, je peux même utiliser l'objet ref AD $ et mettre à jour DomainA_ADobject:

$AD.Value.employeeNumber = 9999 
$User 

UserID    : MyUser1 
DomainA_ADObject : @{ParentContainer=DomainA/Users; AccountIsDisabled=False; employeeNumber=9999} 
DomainA_Confidence : 
DomainB_ADObject : 
DomainB_Confidence : 

Cependant, essayer avec l'arbitre CF $ et la même chose ne se produit pas

$CF.Value = 2 
$CF 

Value 
----- 
2 

$User 

UserID    : MyUser1 
DomainA_ADObject : @{ParentContainer=DomainA/Users; AccountIsDisabled=False; employeeNumber=9999} 
DomainA_Confidence :       *<====== Expecting this to update!* 
DomainB_ADObject : 
DomainB_Confidence : 

Pourquoi différence? Est-il possible d'interroger un objet [ref] et de voir à quoi il renvoie? Je ne vois pas pourquoi l'un travaille et l'autre ne fonctionne pas. Ils semblent tous les deux être mis en place de la même manière. J'ai essayé cela dans ISE et la console, même comportement dans les deux.

+0

Je rencontre quelque chose de similaire et ne peut pas sembler trouver une explication – samaspin

+0

'[ref]' ne devrait pas fonctionner ici. C'est pour les méthodes d'appel avec des paramètres 'ref' pas pour les propriétés de référencement. – PetSerAl

Répondre

0

Je suppose que cela est causé par des points au nom de domaines. Réduire cette base à $ CF.Value = 1 ne someting comme

données $ [0] = 1 .domain.name.net.au_Confidence.value

Cela ne fonctionnera pas. Cette volonté.

$ données [0] "domain.name.net.au_Confidence" .value = 1

Peut-être que cela va corriger ?:

$CF = [ref]$User."`"$($Domain)_Confidence`"" 
Questions connexes