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.
Je rencontre quelque chose de similaire et ne peut pas sembler trouver une explication – samaspin
'[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