Bonjour,

Je vous présente $addr:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
[DBG]: PS G:\>>> $addr
machine@bidule.com
$addr est une String:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
[DBG]: PS G:\>>> $addr.getType()

IsPublic IsSerial Name                                     BaseType                                                                                    
-------- -------- ----                                     --------                                                                                    
True     True     String                                   System.Object
Le problème:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
[DBG]: PS G:\>>> Set-ADUser $username -Replace @{'info'=$addr}
Type non valide « System.Management.Automation.PSObject ».
Nom du paramètre*: info
Au niveau de ligne*: 1 Caractère*: 11
+ Set-ADUser <<<<  $username -Replace @{'info'=$addr}
    + CategoryInfo          : InvalidArgument: (machin:ADUser) [Set-ADUser], ArgumentException
    + FullyQualifiedErrorId : Type non valide « System.Management.Automation.PSObject ».
Nom du paramètre*: info,Microsoft.ActiveDirectory.Management.Commands.SetADUser
Après une heure de débogage:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
[DBG]: PS G:\>>> Set-ADUser $username -Replace @{'info'=$addr.ToString()}
Ca passe...

Pour être sûr:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
[DBG]: PS G:\>>> $addr.getType() -eq $addr.ToString().getType()
True

[DBG]: PS G:\>>> $addr -eq $addr.ToString()
True
C'est reproductible et à un autre endroit dans le code j'ai du également utiliser $addr.ToString() pour résoudre un problème similaire.

Comment est-ce possible ?

Y a-t-il plusieurs types String identiques en apparence mais différents ?

Suis-je condamné à sombrer dans la folie si je continue à utiliser PowerShell ?

La génération de la valeur de $addr est un peu longue mais la seule partie sur laquelle j'ai un doute est une fonction que j'ai reprise du Web pour enlever les accents et autres diacritiques:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Remove-Diacritics {
param ([String]$src = [String]::Empty)

    foreach ($s in $src) {
        if ($s -eq $null) { return [String]::Empty }
        $s = $s.Normalize("FormD")
        $s.ToCharArray() | % {
            $uCategory = [Globalization.CharUnicodeInfo]::GetUnicodeCategory($_)
            if ($uCategory -ne "NonSpacingMark") {
                $res += $_
            }
        }
        return $res
    }
}
Est-ce que cela pourrait venir de là ?