В трудовых буднях администратора баз данных не редко встречается задача инвентаризации своего серверного хозяйства или инвентаризации принимаемого на обслуживание сервера. Благодаря существованию WMI эта задача может быть частично или полностью автоматизирована. А благодаря PowerShell автоматизация становиться очень простой. В подтверждение этих слов приведу две ссылки:

Однако, поглядев на возможности WMI возникает резонный вопрос, что из этого многообразия свойств объектов стоит сохранять в инвентаризационной описи?

Вашему вниманию предлагается макет упрощённого PS-сценария, который делает опись текущего компьютера. Если нужно инвентаризировать удалённый компьютер, то присвойте переменной $srv не точку, а имя нужного сервера. Вывод информации происходит в файл, путь к которому тоже задаётся переменной и может быть изменён по необходимости.

    $srv = "."
    $Day = get-date -format "yyyyMMdd"
    $Time = get-date -format "HH"
    $LogFile = "c:\temp\Inventory_"+$srv + "_" + $Day + $Time + ".txt"
    "--------------------------- Computer  System --------------------------------------------------------------------------" | out-File "$LogFile" –append
    Get-WmiObject "Win32_ComputerSystem" -computer $srv | Format-Table -Wrap -Property Domain,PrimaryOwnerName,DNSHostName,
    Model,SystemType,NumberOfLogicalProcessors,NumberOfProcessors,TotalPhysicalMemory | out-File "$LogFile" –append
    "---------------------------     Network      --------------------------------------------------------------------------" | out-File "$LogFile" –append
    Get-WmiObject -class "Win32_NetworkAdapter" -computer $srv | Format-Table -Wrap -Property Name,AdapterType,DeviceID,
    Manufacturer,ServiceName | out-File "$LogFile" –append
    Get-WmiObject "Win32_NetworkAdapterConfiguration" -computer $srv | Format-Table -Wrap -Property IP | out-File "$LogFile" –append
    "---------------------------   Disk Drives    --------------------------------------------------------------------------" | out-File "$LogFile" –append
    Get-WmiObject "Win32_DiskDrive" -computer $srv | Format-Table -Wrap -Property Name,Model,InterfaceType,Partitions,SCSIBus,
    SCSILogicalUnit,SCSIPort,SCSITargetId,Size,BytesPerSector,SectorsPerTrack,TracksPerCylinder,TotalCylinders,TotalSectors,
    TotalTracks,TotalHeads | out-File "$LogFile" –append
    Get-WmiObject "Win32_DiskPartition" -computer $srv | Format-Table -Wrap -Property Name,Type,Index,BootPartition,
    PrimaryPartition,BlockSize,StartingOffset,NumberOfBlocks,Size | out-File "$LogFile" –append
    Get-WmiObject "Win32_Volume" -computer $srv | Format-Table -Wrap -Property Name,SerialNumber,DriveType,FileSystem,Capacity,
    FreeSpace,BlockSize,Compressed | out-File "$LogFile" –append
    Get-WmiObject -class "Win32_Share" -computer $srv | Format-Table -Wrap -Property Name,Path | out-File "$LogFile" –append
    "---------------------------    Processors    --------------------------------------------------------------------------" | out-File "$LogFile" –append
    Get-WmiObject "Win32_Processor" -computer $srv | Format-Table -Wrap -Property Name,DeviceID,CurrentClockSpeed,ExtClock,
    DataWidth,L2CacheSize,Version | out-File "$LogFile" –append
    "--------------------------- Operating System --------------------------------------------------------------------------" | out-File "$LogFile" –append
    Get-WmiObject "Win32_OperatingSystem" -computer $srv | Format-Table -Wrap -Property Name,Version,ServicePackMajorVersion,
    ProductType,TotalVisibleMemorySize,PAEEnabled | out-File "$LogFile" –append
    "---------------------------    Sql Server    --------------------------------------------------------------------------" | out-File "$LogFile" –append
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null
    $server=new-object("Microsoft.SqlServer.Management.Smo.Server") $srv
    $server | Format-Table -Wrap -Property Product,Name,InstanceName,VersionString,Edition,InstallDataDirectory,PerfMonMode,
    ProductLevel,SqlCharSetName,SqlDomainGroup,NumberOfLogFiles,BackupDirectory | out-File "$LogFile" –append
    $server | Format-Table -Wrap -Property LoginMode,AuditLevel,ProxyAccount,TcpEnabled,NamedPipesEnabled,Collation,
    SqlSortOrderName,Language,IsCaseSensitive | out-File "$LogFile" –append
    "Services" | out-File "$LogFile" –append
    $server | Format-Table -Wrap -Property IsClustered,ServiceAccount,SrviceInstanceId,ServiceName,ServiceStartMode,
    BrowserServiceAccount,BrowserStartMode,IsFullTextInstalled,FilestreamLevel | out-File "$LogFile" –append