Fork me on GitHub

PowerShell: получение данных о компьютерах

Получение данных о компьютерах

function Get-SystemInfo {
<#
.SYNOPSIS
.DESCRIPTION
.EXAMPLE
"comp1","comp2","comp3" | ? { Test-Connection $_ -Count 1 -ea SilentlyContinue } | Get-SystemInfo
#>
[CmdletBinding( SupportsShouldProcess = $true )]
param (
[Parameter(ValueFromPipelineByPropertyName=$True,
ValueFromPipeline=$True)]
[string[]]$ComputerName = $env:COMPUTERNAME
)
begin {
if ($PSBoundParameters.Verbose) {$VerbosePreference = "Continue"}

function PIDDecoderFromRegistry($digitalProductId) {

New-Variable -Name base24 -Value 'BCDFGHJKMPQRTVWXY2346789'    -Option Constant ## <24> символа использующиеся в ключах продукта Windows и Office
New-Variable -Name decodeStringLength -Value 24       -Option Constant ## ‘Чистая’ длина зашифрованного ключа продукта
New-Variable -Name decodeLength -Value 14             -Option Constant ## Длина зашифрованного ключа продукта в байтах (символы хранятся в полубайтах)
New-Variable -Name decodedKey -Value ([System.String]::Empty)     ## Строка содержащая расшифрованный ключ продукта

## Проверка, содержит ли ключ продукта ‘N’ (такое возможно для Windows 8 и Office 15)

$containsN = ($digitalProductId[$decodeLength] / 8) -bAnd 1        ## ($digitalProductId[$decodeLength] -shr 3) -bAnd 1 ## PS 4.0
$digitalProductId[$decodeLength] = [System.Byte]($digitalProductId[$decodeLength] -bAnd [System.Convert]::ToByte('F7', 16)) ## 247

## Собственно процесс расшифровки

for ($i = $decodeStringLength; $i -ge 0; $i--) {
$digitMapIndex = 0
for ($j = $decodeLength; $j -ge 0; $j--) {
$digitMapIndex = $digitMapIndex * 256 -bXor $digitalProductId[$j] ## $digitMapIndex -shl 8 -bXor $digitalProductId[$j] ## PS 4.0
$digitalProductId[$j] = [System.Math]::Truncate($digitMapIndex / $base24.Length)
$digitMapIndex = $digitMapIndex % $base24.Length
}
$decodedKey = $decodedKey.Insert(0, $base24[$digitMapIndex])
}
```

## Удаление первого символа в ключе и помещение ‘N’ в нужную позицию

if ([System.Boolean]$containsN)
{
$firstLetterIndex = 0
for ($index = 0; $index -lt $decodeStringLength; $index++) {
if ($decodedKey[0] -ne $base24[$index]) {continue}
$firstLetterIndex = $index
break
}
$keyWithN = $decodedKey
$keyWithN = $keyWithN.Remove(0, 1)
$keyWithN = $keyWithN.Substring(0, $firstLetterIndex) + 'N' + $keyWithN.Remove(0, $firstLetterIndex)
$decodedKey = $keyWithN;
}
$returnValue = $decodedKey

## Вставка тире через каждые пять символов

for ($t = 20; $t -ge 5; $t -= 5)
{
$returnValue = $returnValue.Insert($t, '-')
}
return $returnValue
}
#########################################################################
New-Variable -Name hklm -Value 2147483650  -Option Constant
New-Variable -Name regPath -Value 'Software\Microsoft\Windows NT\CurrentVersion' -Option Constant
New-Variable -Name regValue -Value 'DigitalProductId' -Option Constant
######################################
$parameters_switch = @{}
$current_function = get-item (Join-Path function: $MyInvocation.MyCommand);
$current_function.parameters.values |
#where { @($_.attributes | % {$_.position}) -eq [int]::MinValue} |       # only custom parameters; только втроенные параметры функций.
where { $_.SwitchParameter } |                                          # only switchers; только переключатели
where { $PSBoundParameters.ContainsKey( $_.name)}|
foreach { $parameters_switch.add($_.name, $PSBoundParameters[$_.Name] ) }

} process {
if ($ComputerName.count -gt 1) { $ComputerName |?{$_}|%{$_} | &$current_function.Name @parameters_switch ; return }
if ($_ -ne $null) {
if ($_.GetType().fullname -eq "Microsoft.ActiveDirectory.Management.ADComputer") { $ComputerName = $_.Name; }
if ($_.GetType().fullname -eq "Quest.ActiveRoles.ArsPowerShellSnapIn.Data.ArsComputerObject") { $ComputerName = $_.Name; }
}
if ($PSCmdlet.ShouldProcess($ComputerName, "Get-SystemInfo") ) {
try {

$CS = gwmi -comp $ComputerName -ea stop win32_computersystem
$Procc = gwmi -comp $ComputerName -ea stop Win32_Processor
$os = gwmi -comp $ComputerName -ea stop win32_operatingsystem
$mb = gwmi win32_baseboard -comp $ComputerName
$logical_disks = gwmi Win32_LogicalDisk -Filter "DriveType=3" -ComputerName $ComputerName
$ph_memory = gwmi win32_physicalmemory -comp $ComputerName

$wmi = [WMIClass]"\\$ComputerName\root\default:stdRegProv"
$binArray = $wmi.GetBinaryValue($hklm,$regPath,$regValue).uValue[52..66]

$ComputerName | select @{n="ComputerName";e={$_}},
@{n="User";e={$CS | % {$_.username.split("")[1]} }},
@{n="Memory";e={ $CS | % { $_.TotalPhysicalMemory /1mb -as [int]}} },
@{n="MemoryDetail";e={
@(
$ph_memory|
group -Property capacity |
foreach {
$_.count.ToString() + "*" + [math]::Round($_.name/1mb,0)
}
) -join " + "}},
@{n="ProccName";e={if ($Procc.name) {$Procc.name.trim(" ") -replace "\s{2}"," "} else {""}} },
@{n="Clock";e={$Procc.MaxClockSpeed }},
@{n="Core";e={$procc.NumberofCores}},
@{n="Socket";e={
switch -regex ($Procc.SocketDesignation) {
"775|j3e1" {"Socket 775"}
"478|j2e1" {"Socket 478"}
default {$_}
}
}},
@{n="OSname";e={$os.caption}},
@{n="SystemType";e={$CS.SystemType}},
@{n="OS_SP";e={$os.csdversion}},
@{n="OSLanguage";e={$os.oslanguage}},
@{n="OSInstall";e={[Management.ManagementDateTimeConverter]::ToDateTime($os.InstallDate);}},  #2 способ. ([wmi] '').ConvertToDateTime($os.InstallDate)
@{n='ProductKey';e={  if ($binArray) { PIDDecoderFromRegistry($binArray) } }},
@{n="MatherBoard";e={$mb.Manufacturer + " " + $mb.Product}},
@{n="Volumes";e={

$logical_disks |

Select-Object @{n='Letter';e={$_.deviceid}},
@{n='VolumeName';e={$_.VolumeName}},
@{n='Size';e={ ([math]::round($_.Size/1gb,1)) }},
@{n='Free';e={ ([math]::round($_.freespace/1gb,1))}},
@{n='Used';e={ ([math]::round(($_.Size-$_.freespace)/1gb,1)) }},
@{n="HardDisk";e={
gwmi -ComputerName $ComputerName -Query ("Associators of {" + $_.__path + "} Where ResultClass=Win32_DiskPartition") |
where {$part = $_; $_ } |
foreach {
$hd = gwmi -ComputerName $ComputerName -Query ("Associators of {" + $part.__path + "} Where ResultClass=Win32_DiskDrive")
$hd.caption + " (" + [math]::Round($hd.size/1gb,0) + " Gb)"
}
}};
}};
} catch { Write-Error $_; }
}
}
end {
}
}

social