powershell получить информацию о компьютере - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь создать сценарий powershell (становясь более продвинутым ... JK. Powershell предлагает больше возможностей, чем командный файл, и я хочу использовать некоторые из них.)

Итак, вот мойПакетный скрипт:

:Start 
@echo off 
set /p password="Password:" 
:Nextcomp 
set /p computer="Computer name:" 
wmic /user:username /password:%password% /node:"%computer%" memorychip get capacity 
set /P c=Do you want to get info about another computer (y/n)? 
if /I "%c%" EQU "y" goto :Nextcomp 
if /I "%c%" EQU "n" goto :End goto :choice 
pause 
:End

И вот что я нашел: Скрипт Я изменил его для своих нужд, но всякий раз, когда я пытаюсь запустить этот скрипт, я получаю его неправильно - он отображаетмне весь сценарий, и только в конце он спрашивает меня об имени компьютера:

$resultstxt = "C:\Users\user\Documents\results.csv"
Param(
     [Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
     [SecureString]$password
   )
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
$Computer = Read-Host -Prompt 'Computer name'
$out = @()
If (!(Test-Connection -ComputerName $Computer -Count 1 -Quiet)) { 
    Write-Host "$Computer not on network."
    Continue 
}
foreach($object in $HostList) {
$RAM = get-wmiobject -user user -password $pw -computername $object.("Computer")-class win32_physicalmemory 
$DeviceInfo= @{}
$DeviceInfo.add("RAM", "$([math]::floor($RAM.Capacity/ (1024 * 1024 * 1024 )) )" + " GB" )
$DeviceInfo.add("Computer Name", $vol.SystemName)
$out += New-Object PSObject -Property $DeviceInfo | Select-Object "RAM"
Write-Verbose ($out | Out-String) -Verbose             
$out | Export-CSV -FilePath $resultstxt -NoTypeInformation

}

Как вы уже догадались, у меня есть намного больше полей, но онивсе похожи, и я заимствовал из многих источников, но в основном из ссылки «Сценарий».

То, что я хочу:

  1. Скрыть пароль
  2. Экспорт информации в CSV, с каждым новым компьютером (см. 3.), добавленным после текущего компьютера (на следующей строке)
  3. Спросите, хочу ли я получить информацию о другом компьютере, с помощью клавиши «y»для да, "n" для нет.
  4. заставить скрипт работать

я нашело проблеме 1, но я еще не проверял ее, так что ... сработает?Затем я обнаружил проблему 2, но она отображала бы всю информацию в непростом для чтения формате, а не все, что мне нужно, и все в одной ячейке.Наконец, около 3, я нашел, но это не сработало.Не могу сказать, что выкопал весь Интернет, но я надеюсь, что вы, ребята (и девочки?), Сможете помочь мне разобраться.Не должно быть так сложно решить эти 3 проблемы, ведь это не супер сложный сценарий, верно?Мой текущий скрипт содержит всего 31 строку, включая пробелы.

1 Ответ

0 голосов
/ 01 февраля 2019

Это демонстрация одного способа получения базовой информации о системе из группы систем.он использует командлеты CIM, так как они работают быстрее, чем командлеты WMI [большую часть времени], представляют информацию о дате и времени как стандартные объекты даты и времени, и не считаются устаревшими.

он также использует командлет Invoke-Command для удаленного параллелизма и настроен на игнорирование ошибок, чтобы не отвечающие системы не тратили ваше время.

#requires -RunAsAdministrator

# fake reading in a list of computer names
#    in real life, use Get-Content or (Get-ADComputer).Name
$ComputerList = @'
Localhost
BetterNotBeThere
127.0.0.1
10.0.0.1
::1
'@ -split [environment]::NewLine

$IC_ScriptBlock = {
    $CIM_ComputerSystem = Get-CimInstance -ClassName CIM_ComputerSystem
    $CIM_BIOSElement = Get-CimInstance -ClassName CIM_BIOSElement
    $CIM_OperatingSystem = Get-CimInstance -ClassName CIM_OperatingSystem
    $CIM_Processor = Get-CimInstance -ClassName CIM_Processor
    $CIM_LogicalDisk = Get-CimInstance -ClassName CIM_LogicalDisk |
        Where-Object {$_.Name -eq $CIM_OperatingSystem.SystemDrive}

    [PSCustomObject]@{
        LocalComputerName = $env:COMPUTERNAME
        Manufacturer = $CIM_ComputerSystem.Manufacturer
        Model = $CIM_ComputerSystem.Model
        SerialNumber = $CIM_BIOSElement.SerialNumber
        CPU = $CIM_Processor.Name
        SysDrive_Capacity_GB = '{0:N2}' -f ($CIM_LogicalDisk.Size / 1GB)
        SysDrive_FreeSpace_GB ='{0:N2}' -f ($CIM_LogicalDisk.FreeSpace / 1GB)
        SysDrive_FreeSpace_Pct = '{0:N0}' -f ($CIM_LogicalDisk.FreeSpace / $CIM_LogicalDisk.Size * 100)
        RAM_GB = '{0:N2}' -f ($CIM_ComputerSystem.TotalPhysicalMemory / 1GB)
        OperatingSystem_Name = $CIM_OperatingSystem.Caption
        OperatingSystem_Version = $CIM_OperatingSystem.Version
        OperatingSystem_BuildNumber = $CIM_OperatingSystem.BuildNumber
        OperatingSystem_ServicePack = $CIM_OperatingSystem.ServicePackMajorVersion
        CurrentUser = $CIM_ComputerSystem.UserName
        LastBootUpTime = $CIM_OperatingSystem.LastBootUpTime
        }
    }

$IC_Params = @{
    ComputerName = $ComputerList
    ScriptBlock = $IC_ScriptBlock
    ErrorAction = 'SilentlyContinue'
    }
$RespondingSystems = Invoke-Command @IC_Params
$NOT_RespondingSystems = $ComputerList.Where({
    # these two variants are needed to deal with an ipv6 localhost address
    "[$_]" -notin $RespondingSystems.PSComputerName -and
    $_ -notin $RespondingSystems.PSComputerName
    })

# if you want to remove the PSShowComputerName, PSComputerName & RunspaceID props, use ... 
#    Select-Object -Property * -ExcludeProperty PSShowComputerName, PSComputerName, RunspaceId


'=' * 40
$RespondingSystems
'=' * 40
$NOT_RespondingSystems

усеченный вывод ...

LocalComputerName           : [MySysName]
Manufacturer                : System manufacturer
Model                       : System Product Name
SerialNumber                : System Serial Number
CPU                         : AMD Phenom(tm) II X4 945 Processor
SysDrive_Capacity_GB        : 931.41
SysDrive_FreeSpace_GB       : 745.69
SysDrive_FreeSpace_Pct      : 80
RAM_GB                      : 8.00
OperatingSystem_Name        : Microsoft Windows 7 Professional 
OperatingSystem_Version     : 6.1.7601
OperatingSystem_BuildNumber : 7601
OperatingSystem_ServicePack : 1
CurrentUser                 : [MySysName]\[MyUserName]
LastBootUpTime              : 2019-01-24 1:49:31 PM
PSComputerName              : [::1]
RunspaceId                  : c1b949ef-93af-478a-b2cf-e44d874c5724

========================================
BetterNotBeThere
10.0.0.1

, чтобы получить хорошо структурированный CSV-файл, отправьте коллекцию $RespondingSystems в файл через Export-CSV.


для демонстрации цикла, чтобы обернуть любой данный блок кода, взгляните на это ...

$Choice = ''

while ([string]::IsNullOrEmpty($Choice))
    {
    $Choice = Read-Host 'Please enter a valid computer name or [x] to exit '
    # replace below with real code to check if $ComputerName is valid
    if ($Choice -eq $env:COMPUTERNAME)
        {
        $ValidCN = $True
        }
        else
        {
        $ValidCN = $False
        }
    if (-not $ValidCN -and $Choice -ne 'x')
        {
        # insert desired error notice
        [console]::Beep(1000, 300)
        Write-Warning ''
        Write-Warning ('Your choice [ {0} ] is not a valid computer name.' -f $Choice)
        Write-Warning '    Please try again ...'
        pause
        $Choice = ''
        }
        elseif ($Choice -ne 'x')
        {
        # insert code to do the "ThingToBeDone"
        Write-Host ''
        Write-Host ('Doing the _!_ThingToBeDone_!_ to system [ {0} ] ...' -f $Choice)
        pause
        $Choice = ''
        }
    }

на экране вывода ...

Please enter a valid computer name or [x] to exit : e
WARNING: 
WARNING: Your choice [ e ] is not a valid computer name.
WARNING:     Please try again ...
Press Enter to continue...: 
Please enter a valid computer name or [x] to exit : [MySysName]

Doing the _!_ThingToBeDone_!_ to system [ [MySysName] ] ...
Press Enter to continue...: 
Please enter a valid computer name or [x] to exit : x
...