“Get-AdComputer -filter” não retorna nada ao procurar por clientes do Vista

6

Por que Get-Computers -OperatingSystem "Windows VistaT Business" não retorna nada? Ele funciona perfeitamente para todos os outros tipos de sistema operacional.

Function Get-Computers
{
    Param($OperatingSystem)

    Get-AdComputer -Filter 'OperatingSystem -eq ${OperatingSystem}' -SearchBase "OU=Departement,DC=contoso,DC=com"
}

#Get-Computers -OperatingSystem "Windows Server 2012 R2 Standard"
#Get-Computers -OperatingSystem "Windows Server 2008 R2 Standard"
#Get-Computers -OperatingSystem "Windows 7 Professional"
Get-Computers -OperatingSystem "Windows VistaT Business"

Eu definitivamente tenho clientes do Vista e a string a ser procurada é Windows VistaT Business .

PS C:\> (get-adcomputer ClientA -Properties *).OperatingSystem
Windows 7 Professional
PS C:\> (get-adcomputer ClientB -Properties *).OperatingSystem
Windows VistaT Business
    
por Matze 21.11.2014 / 14:32

1 resposta

9

Esse T em "VistaT" não é nenhum T - representa um símbolo de marca registrada: ™ (U + 2122 ou # 8482 em Unicode)

Tente isto:

Get-Computers -OperatingSystem $("Windows Vista" + [char]8482 + " Business")

Por que a Microsoft optou por abusar da capacidade de armazenar símbolos unicode em atributos de valor de string desta forma está além de mim.

Aqui está como eu descobri:

(quando você converter um .NET char em um inteiro, você obterá o valor de byte para caracteres ASCII ou um ponto de código de 2 bytes para caracteres unicode)

$osString = (Get-ADComputer [VistaComputerName] -Properties operatingSystem).operatingSystem

foreach($c in $osString.ToCharArray())
{
    Write-Host $("$c: " + "$([int]$c)")
}

Neste ponto, minha saída consistia em todos os caracteres ASCII (todos inteiros são um único byte), exceto pelo T :

W: 87
i: 105
n: 110
d: 100
o: 111
w: 119
s: 115
 : 32
V: 86
i: 105
s: 115
t: 116
a: 97
T: 8482
 : 32
B: 66
u: 117
s: 115
i: 105
n: 110
e: 101
s: 115
s: 115
    
por 21.11.2014 / 18:44