PowerShell опрашивает удаленную систему - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть функция, которую я написал, которая опрашивает мою локальную систему. Просто собираю любую информацию, которую я могу получить в полезном формате. Поэтому мне было интересно узнать о функции, которая могла бы опрашивать другие системы таким способом. function sys-remote <$ip-or-hostname> После этого он может попытаться вернуть как можно больше информации об этой системе. На самом деле это просто идея, и я думаю, что было бы полезно несколько моментов:

• С помощью IP-адреса, как мы можем определить имя хоста наиболее PowerShell'i sh способом?

• Предоставлено ли имя хоста IP-адреса, можем ли мы разрешить как можно больше информации. т.е. MA C адрес, имя хоста, IP (и, возможно, другие IP-адреса, если они могут быть видимы нам)?

• Можем ли мы восстановить общие диски в этой системе, чтобы увидеть список возможных общих ресурсов для подключения к.

• Как насчет системной информации, которая всегда требует WinRM, или WMI или CIM может быть достаточным для большинства вещей, перечисленных ниже?

• Может быть, вернуть также разделенный запятыми список какие порты открыты в этой удаленной системе, если это возможно?

• Что если удаленная система имеет значение Linux. Сколько из вышеперечисленного мы можем разумно получить из системы Linux, которую мы запрашиваем удаленно из нашей системы Windows (я полагаю, что WinRM и WMI отсутствуют, но, возможно, CIM все еще возможен?)?

В целом, было бы очень полезно возвратить подобную информацию с точки зрения диагностики c, поскольку это дало бы тонну информации о системе для работы. Все что угодно как выше (или действительно любые другие полезные вещи, чтобы проверить, о которых я не думал здесь), будет действительно цениться.

function sys {
    $System = get-wmiobject -class "Win32_ComputerSystem"
    $Mem = [math]::Ceiling($System.TotalPhysicalMemory / 1024 / 1024 / 1024)

    $wmi = gwmi -class Win32_OperatingSystem -computer "."
    $LBTime = $wmi.ConvertToDateTime($wmi.Lastbootuptime)
    [TimeSpan]$uptime = New-TimeSpan $LBTime $(get-date)
    $s = "" ; if ($uptime.Days -ne 1) {$s = "s"}
    $uptime_string = "$($uptime.days) day$s $($uptime.hours) hr $($uptime.minutes) min $($uptime.seconds) sec"

    $job_cpu         = Start-Job -ScriptBlock { (Get-WmiObject -Class Win32_Processor).Name }
    $job_cpu_cores   = Start-Job -ScriptBlock { (Get-WmiObject -Class Win32_Processor).NumberOfCores }
    $job_cpu_logical = Start-Job -ScriptBlock { (Get-WmiObject -Class Win32_Processor).NumberOfLogicalProcessors }
    ""
    "Hostname:        $($System.Name)"
    "Domain:          $($System.Domain)"
    "PrimaryOwner:    $($System.PrimaryOwnerName)"
    "Make/Model:      $($System.Manufacturer) ($($System.Model))"  #     "ComputerModel:  $((Get-WmiObject -Class:Win32_ComputerSystem).Model)"
    "SerialNumber:    $((Get-WmiObject -Class:Win32_BIOS).SerialNumber)"
    "PowerShell:      $($PSVersionTable.PSVersion)"
    "Windows Version: $($PSVersionTable.BuildVersion),   Windows ReleaseId: $((Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name 'ReleaseId').ReleaseId)"
    "Display Card:    $((Get-WmiObject -Class:Win32_VideoController).Name)"
    "Display Driver:  $((Get-WmiObject -Class:Win32_VideoController).DriverVersion),   Description: $((Get-WmiObject -Class:Win32_VideoController).VideoModeDescription)"
    "Last Boot Time:  $([Management.ManagementDateTimeConverter]::ToDateTime((Get-WmiObject Win32_OperatingSystem | select 'LastBootUpTime').LastBootUpTime)),   Uptime: $uptime_string"
    $IPDefaultAddress = @(Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object {$_.DefaultIpGateway})[0].IPAddress[0]
    $IPDefaultGateway = @(Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object {$_.DefaultIpGateway})[0].DefaultIPGateway[0]
    "Default IP:      $IPDefaultAddress / $IPDefaultGateway"
    Get-Netipaddress | where AddressFamily -eq IPv4 | select IPAddress,InterfaceIndex,InterfaceAlias | sort InterfaceIndex
    ""
    Wait-Job $job_cpu         | Out-Null ; $job_cpu_out = Receive-Job -Job $job_cpu
    Wait-Job $job_cpu_cores   | Out-Null ; $job_cpu_cores_out = Receive-Job -Job $job_cpu_cores 
    Wait-Job $job_cpu_logical | Out-Null ; $job_cpu_logical_out = Receive-Job -Job $job_cpu_logical
    "CPU:   $job_cpu_out"
    "CPU Cores:   $job_cpu_cores_out,      CPU Logical Cores:   $job_cpu_logical_out"
    # Get-PSDrive | sort -Descending Free | Format-Table
    gwmi win32_logicaldisk | Format-Table DeviceId, VolumeName, @{n="Size(GB)";e={[math]::Round($_.Size/1GB,2)}},@{n="Free(GB)";e={[math]::Round($_.FreeSpace/1GB,2)}}
    gwmi win32_winsat | select-object CPUScore,D3DScore,DiskScore,GraphicsScore,MemoryScore,WinSPRLevel | ft   # removed ,WinSATAssessmentState
    get-WmiObject -class Win32_Share | ft
}

1 Ответ

1 голос
/ 07 апреля 2020

Нет причин делать подобные вещи с нуля. Есть много существующих сценариев для того, что вы делаете. Через Microsoft powershellgallery.com.

Сценарий PowerShell для инвентаризации рабочего стола Сценарий Basi c для сбора инвентаря рабочего стола.

Сценарий инвентаризации оборудования PowerShell Сценарий: Сценарий инвентаризации оборудования PowerShell. Вы когда-нибудь хотели иметь инвентарь, не беспокоясь о том, чтобы каждый находил информацию, необходимую для заполнения информации для вашего инвентаря? Важно поддерживать свой инвентарь в актуальном состоянии. Каждый раз, когда происходит изменение y

DownloadGet-Inventory.ps1

Вы можете просто взять свой скрипт и использовать Invoke-Command (Запускает команды на локальных и удаленных компьютерах.) В удаленном сеансе PowerShell для получения информации об удаленном компьютере.

...