
Alguém sabe como obter a arquitetura do sistema operacional remotamente de vários hosts do Windows via PowerShell?
Responder1
get-wmiobject win32_operatingsystem -computer $_ | select-object OSArchitecture
Você canalizará a lista de nomes de computadores neste comando para que $_ seja interpretado como cada computador em sua lista.
Editar: depois de fazer algumas pesquisas, parece que isso funcionará em 2003 e 2008.
get-wmiobject win32_computersystem -computer $_ | select-object systemtype
Responder2
Para Windows XP/2003 e superior, Win32_Processor possui uma propriedade AddressWidth que será 32 ou 64, conforme apropriado.
Há 1 instância de objeto WMI da classe Win32_Processor para cada CPU conhecida pelo Gerenciador de Dispositivos do Windows, então normalmente já fiz esse tipo de coisa no passado. É VBScript, meu PowerShell é uma droga, mas essa é a ideia...
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor WHERE AddressWidth='64'")
If colItems.Count = 0 Then
strArch = "x86"
Else
strArch = "x64"
End If
atualizar: traduzido para PowerShell:
If ($(Get-WmiObject -Query "SELECT * FROM Win32_Processor WHERE AddressWidth='64'")) {
Write-Host "I'm x64"
} Else {
Write-Host "I'm x86"
}
Responder3
Talvez um pouco menos sofisticado, mas para aqueles que não têm o WMI remoto habilitado, um jeito um pouco tradicional seria:
$compList = #<whatever you use to source your list of machines>
ForEach($comp in $compList){
$testPath64 = '\\' + $comp + '\c$\Program Files (x86)'
$testPath = '\\' + $comp + '\c$\Program Files'
$arch = Test-Path $testPath64
If($arch){Write-Host "$comp is x64"}
Else{
$arch = Test-Path $testPath
If($arch){Write-Host "$comp is x86"}
Else{Write-Host "No idea..."}
}
}
Ou algo assim. O cerne da questão é o caminho de teste para arquivos de programas (x86), que está presente apenas em máquinas de 64 bits.