【问题标题】:PowerShell interrogate a remote systemPowerShell 询问远程系统
【发布时间】:2020-04-06 13:56:13
【问题描述】:

我编写了一个函数来询问我的本地系统。只是收集我能以有用的格式获得的任何信息。所以我想知道一个可以以这种方式询问其他系统的功能。 function sys-remote <$ip-or-hostname> 这样它就可以尝试返回尽可能多的有关该系统的信息。这只是一个想法,我想有几点会很有用:

• 使用 IP 地址,我们如何以最 PowerShell 的方式解析主机名?

• 是否提供IP地址的主机名,我们能否解析尽可能多的信息。即 MAC 地址、主机名、IP(可能还有其他 IP 地址,如果这些对我们可见)?

• 我们能否恢复该系统上的共享驱动器,以便查看可能要连接的共享列表。

• 系统信息呢,是否总是需要 WinRM,或者 WMI 或 CIM 是否足以满足以下大部分内容?

• 如果可能的话,也许还返回一个逗号分隔的远程系统上打开的任何端口的列表?

• 如果远程系统是 Linux 会怎样。我们可以从我们从 Windows 系统远程询问的 Linux 系统中合理地获得多少以上内容(我猜 WinRM 和 WMI 已经过时了,但也许 CIM 仍然可能?)?

一般来说,从诊断的角度返回这样的信息转储会非常有用,因为它会提供有关系统工作的大量信息。像上面这样的任何东西(或者实际上我在这里没有想到的任何其他有用的东西)将不胜感激。

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
}

【问题讨论】:

  • 至于您的问题列表,这是一个项目列表,而不是如何使用 StackOverflow。每一个都应该是一个单独的问题。您的所有问题都可以通过网络搜索轻松回答,例如...“PowerShell 将 IP 解析为主机名”、“PowerShell 远程获取 MAC 地址”等字符串用于您的其他问题。一次一个地解决每个问题,然后把它们放在一起。 CIM 是可行的方法,因为 WMI 仅适用于 Windows,并且要使用 OSX/*Nix 框 PSv7/.Net Core 需要在它们上使用 CIM。
  • 我明白你的意思,我本可以将这些问题作为个别问题提出,但有时很难知道如何组织事情;粗略和不清楚的东西对其他人来说可能是显而易见的和简单的——如果我没有这样问,我不确定我会得到你非常有用的答案。您很快就看到了我的目标,并指出了一些非常有用的线索。
  • 不用担心。当我们浏览我们的东西时,有时我们最终会加载想法、目标等,并推动它们获得想法。

标签: powershell tcp system.diagnostics arp traceroute


【解决方案1】:

没有理由从头开始做这种事情。您正在做的事情有许多现有的脚本。通过 Microsoft powershellgallery.com。

PowerShell Script For Desktop Inventory基本脚本收集 桌面库存。

PowerShell Hardware Inventory Script 场景:PowerShell 硬件 库存脚本。你有没有想过没有库存 去每个地方寻找填写所需信息的麻烦 您的库存信息?保持库存很重要 最新。每次都有变化y

DownloadGet-Inventory.ps1

您可以在 PowerShell 远程会话中使用您的脚本并使用 Invoke-Command(在本地和远程计算机上运行命令。)来获取远程计算机信息。

【讨论】:

  • 谢谢,很好的线索。我可以看到这些将涵盖很多我想要实现的目标。
猜你喜欢
  • 2013-10-15
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 2023-02-04
  • 2014-05-30
  • 1970-01-01
相关资源
最近更新 更多