PowerShell: Propriétés Get-ADUser avec åäö


8

J'essaie d'extraire des ensembles sélectionnés d'utilisateurs avec Get-ADUser. Les utilisateurs appartiennent à des sociétés dont les noms contiennent des caractères non ASCII, par exemple "Gåäördet". Malheureusement, nous devons utiliser la propriété de l'entreprise pour cette tâche et nous en avons également besoin pour travailler à partir d'un script.

Ce qui suit fonctionne très bien dans une session interactive mais ne renvoie aucune donnée lorsqu'il est exécuté dans un script:

$Company = "Gåäördet"
Get-ADUser -Filter "company -eq '$Company'"

Les solutions de contournement que j'ai trouvées fonctionnent mais ne sont pas suffisamment fiables (risque de sélectionner de mauvais objets):

# Work-around 1:
$Company = "Gaaordet" # Replace åäö with aao in the variable
Get-ADUser -Filter "company -eq '$Company'" # Matches the company "Gåäördet", but why?

...ou...

# Work-around 2: 
$Company = "G...rdets" # Use regex for åäö
Get-ADUser -Filter * -Properties Company | ? Company -match "$Company"

Pour plus d'informations: l'encodage des caractères n'est peut-être pas le problème ici. Comme suggéré dans un commentaire, je l'ai mis dans un script. Lisez le commentaire pour chaque ligne Get-ADUser:

$OutputEncoding = [Console]::OutputEncoding

$Company = "aao"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"

$Company = "åäö"
Get-ADUser -Filter "company -eq '$Company'" # No matches

J'espérais que certains d'entre vous pourraient offrir une meilleure solution à cette énigme.


Merci @RyanRies, malheureusement cela n'a pas semblé aider. Lisez ma modification pour plus d'informations.
Tanel Rebane

1
Je peux donc (malheureusement) reproduire ce comportement avec LDP.exe, donc notre problème peut être plus profond que Powershell.
Ryan Ries

Au lieu de -Filter, l'utilisation de -LdapFilter fonctionnerait-elle? Exemple: -LdapFilter "(company = $ Company)"
user2320464

@TessellatingHeckler, toujours aucun match sur "Gåäördet".
Tanel Rebane

@ user2320464, LdapFilter ne produit aucune correspondance non plus.
Tanel Rebane

Réponses:


7

Merci à toute l'aide ici, je suis allé au fond de ce comportement étrange, très apprécié!

Il s'avère que l'argument "-Filter" accepte "åäö" de manière interchangeable avec "aao". Ce n'est pas le fait de PowerShell mais plus bas dans la pile (merci @RyanRies de l'avoir examiné). C'est la raison pour laquelle l'extrait de code suivant fonctionne:

$Company = "aao"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"

Il s'avère également que la requête n'est pas sensible à la casse, donc cela fonctionne aussi:

$Company = "AaO"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"

En fait, "åäö" fonctionne aussi tant qu'il s'agit d'une requête unicode (merci @Daniel):

$Company = "$([char]0x00E4)$([char]0x00E5)$([char]0x00F6)" # "åäö"
Get-ADUser -Filter "company -eq '$Company'" # Matches company "åäö"

En fin de compte, cela nous laisse deux options:

  • Remplacez "åäö" par "aao" dans vos requêtes. La sortie sera identique à l'utilisation de "åäö".
  • Remplacez "åäö" par unicode (@ joel-coel, merci pour le coup de pouce), par exemple avec un script.

J'ai choisi d'aller avec la deuxième option et le résultat ressemble un peu à ceci:

function UniReplace($n){
    [char][int]"0x$n"
}

$Company = "åäö"
$Company = $Company -Replace 'ä',"$(UniReplace E4)"
$Company = $Company -Replace 'Ä',"$(UniReplace C4)"
$Company = $Company -Replace 'å',"$(UniReplace E5)"
$Company = $Company -Replace 'Å',"$(UniReplace C5)"
$Company = $Company -Replace 'ö',"$(UniReplace F6)"
$Company = $Company -Replace 'Ö',"$(UniReplace D6)"

echo "This is the content of string `$Company: $Company"
Get-ADUser -Filter "company -eq '$Company'"

Je suppose que c'est aussi bon que possible pour l'instant.


2

Je pourrais vous aider avec une solution de contournement.

Créez un fichier texte encodé Unicode et insérez le nom de la société. Utilisez ensuite Get-Contentpour stocker le nom de l'entreprise dans une variable.

$companyName = Get-Content .\companyName-unicode.txt
Get-ADUser -Filter { company -eq $companyName }

Je l'ai testé avec du texte chinois (中國 哲學 書 電子 化 計劃) et cela a fonctionné sur mon serveur.


Merci @Daniel, cette solution de contournement a bien fonctionné. Cependant, il est très sale. Voyons voir si quelqu'un d'autre a une entrée aussi.
Tanel Rebane

Ouais je sais. J'espère que quelqu'un a obtenu une bonne réponse à votre prière - euh - problème. :)
Daniel

@TessellatingHeckler, lors de vos tests, quels caractères non ASCII essayez-vous de faire correspondre?
Tanel Rebane

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.