【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)

Powershell 服务器系统管理信息总结

进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件...


1. 简单示例与说明

1.1 直接使用

函数均为静态函数,因此通过类进行调用而不是类的实例。返回值以数组和哈希表居多,如:

由于可能存在对象的嵌套,而powershell终端在现实这些对象时并不会嵌套现实,因此如果你想看到更多的层次,可能需要对这些对象进行序列化,比如转化为JSON格式进行显示,如:

[sysinfos]::GetDiskUsage() | ConvertTo-Json

效果如下:

可以看到,这个方法输出了当前主机上所有磁盘的使用信息(剩余容量、总容量以及使用率)。

再如,由于在Winserver 2012 以前的系统,Powershell 没有Get-NetAdapter命令,若也想在这些系统上通过 powershell 查看网络设配器信息,可以使用GetNetAdapter方法:

[sysinfos]::GetNetAdapter()

效果如下:

同样,你也可以将这些信息转换为JSON的格式进行现实:

[sysinfos]::GetNetAdapter() | ConvertTo-Json

或者直接将这些信息输出为一个.json文档,如:

[sysinfos]::GetNetAdapter() | ConvertTo-Json > C:\Users\a2911\Desktop\NetAdapterInfos.json

运行后将在指定的位置生成相应文本文档

更多的方法与对应功能的描述请参考 2. 功能查询 小节。

1.2 在脚本中使用

以下是以一个从我日常脚本中截取出来的一段,用于运维时获取某台服务器的相关数据,提交到指定的数据集中服务器上以集中管理数据。可以在Windows任务计划中添加定时任务,以定时向数据管理的服务器来提交最新的服务器运行数据。

using module .\jcstdio\os.psm1
using module .\jcstdio\http.psm1
$body = @{
    HostName = "MYSERVER_XX";
    IPAddress = [sysinfos]::GetIpAddress();              # 获取IP相关数据
    CPU_Load = [sysinfos]::GetCPULoad();                 # 获取CPU使用率,数组(针对多CUP、多核心)
    Drive_Space = [sysinfos]::GetDiskUsage();            # 各个硬盘分区的使用情况
    MemoryInfos = [sysinfos]::GetMemoryInfos();          # 内存相关信息,如使用率
    System_Running_Time = [sysinfos]::GetSystemRunningTime();
    Java_Service = [sysinfos]::GetProcessInfos()["JavaService.exe"];
    Oracle_Service = [sysinfos]::GetProcessInfos()["oracle.exe"];
    JBoss_Services =   [sysinfos]::GetServiceInfos()["JBoss"];
};
$requests = [requests]::new();
$requests.post("http://xx.xx.xx:xxxx/xxx/",($body | ConvertTo-Json))

2. 功能查询

函数名 描述
GetServiceInfos 获取指定服务的相关数据
GetProcessInfos 获取所有进程的相关数据
IP4RouteTable 表示控制网络数据包路由的信息
GetSystemRunningTime 获取系统持续运行时间
GetCPULoad 获取CUP各核心使用率
GetThread 获取执行线程
GetNetAdapter 获取网络适配器信息
GetIpAddress 从ipconfig中获取各网络硬件地址信息
GetNetAdapterByDeviceID
GetNetAdapterByName
GetNetAdapterByMACAddress
GetVolume 获取计算机上的存储区域
GetMemoryInfos 获取内存相关数据,如使用率等
GetLocalTime 获取计算机本地时间
GetSessionProcess 获取登录会话与该会话关联的进程之间的关联
GetSystemAccount 获取Windows系统账户
GetUserAccount 获取Windows系统上的用户账户信息
GetStartupCommand 获取当用户登录到计算机时自动运行的命令
GetUserInDomain 获取关联用户账户和 Windows NT 域
GetNTLogEvent 获取Windows事件
GetNTEventLogFile 获取存储在Windows事件日志中的数据
GetDiskPartition 获取运行Windows的计算机系统上物理磁盘分区区域的功能和管理容量
GetDiskUsage 获取所有分区使用情况
GetLogicalProgramGroup 获取运行Windows的计算机系统中的程序组
GetLogicalProgramGroupDirectory 将逻辑程序组 (分组关联到"开始"菜单) 中,以及存储它们的文件目录
GetLogicalProgramGroupItem 表示 由Win32_ProgramGroup 实例包含的元素,该元素本身不是另一个 Win32_ProgramGroup 实例
GetLogicalProgramGroupItemDataFile 将"开始"菜单的程序组项及其存储在其中的文件关联
GetProgramGroupContents 关联程序组顺序和包含的单个程序组或项
GetProgramGroupOrItem 获取用户"开始"菜单

3. sysinfos源代码

以下可单独存为psm1模块:

<#
@Auth: Jack Lee;
@Email: 291148484@163.com;
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#>
class sysinfos {
    static [object]GetServiceInfos() {
        <# Get the related data of the specified service. #>
        $services = Get-WmiObject -Class Win32_Service
        $service_info=@{}
        foreach ($i in $services) {
            $ServiceName = $i.Name
            if($ServiceName -ne $null){
                $service_info[$ServiceName] =  @{};
                $service_info[$ServiceName]["ExitCode"] = $i.ExitCode;
                $service_info[$ServiceName]["ProcessID"] = $i.ProcessID;
                $service_info[$ServiceName]["StartMode"] = $i.StartMode;
                $service_info[$ServiceName]["State"] = $i.State;
                $service_info[$ServiceName]["Status"] = $i.Status;
            }
        }
        return $service_info
    }
    # (GetServiceInfos)["JBoss"] | ConvertTo-Json
    static [object]IP4RouteTable(){
        <# Information that controls the routing of network packets #>
        return Get-WmiObject -Class Win32_IP4RouteTable
    }
    static [object]GetProcessInfos() {
        <# Get the relevant data of all processes #>
        $process = Get-WmiObject -Class Win32_Process;
        $process_info=@{};
        foreach ($i in $process) {
            $ProcessName = $i.Name
            if($ProcessName -ne $null){
                $process_info[$ProcessName] = @{};
                $process_info[$ProcessName]["Path"] = $i.Path; 
                $process_info[$ProcessName]["ExecutablePath"] = $i.ExecutablePath; 
                $process_info[$ProcessName]["Description"] = $i.Description;
                $process_info[$ProcessName]["CreationDate"] = $i.CreationDate;
                $process_info[$ProcessName]["InstallDate"] = $i.InstallDate;
                $process_info[$ProcessName]["TerminationDate"] = $i.TerminationDate;
                $process_info[$ProcessName]["UserModeTime"] = $i.UserModeTime;
                $process_info[$ProcessName]["Prioroty"] = $i.Prioroty;
                $process_info[$ProcessName]["Status"] = $i.Status;
                $process_info[$ProcessName]["SessionID"] = $i.SessionID;
                $process_info[$ProcessName]["ThreadCount"] = $i.ThreadCount;
                $process_info[$ProcessName]["CSName"] = $i.CSName;
                $process_info[$ProcessName]["Handle"] = $i.Handle;
                $process_info[$ProcessName]["HandleCount"] = $i.HandleCount;
                $process_info[$ProcessName]["VirtualSize"] = $i.VirtualSize;
                $process_info[$ProcessName]["WorkSetSize"] = $i.WorkSetSize;
            }
        }
        return $process_info
    }
    static [object]GetSystemRunningTime() {
        <# Get the running time of the system #>
        return ([Environment]::TickCount /86400000).ToString().Substring(0,3)+" D"
    }
    static [object]GetCPULoad(){
        <# Get the utilization rate of each core of CUP #>
        return @((Get-WmiObject -Class Win32_processor).LoadPercentage)
    }
    static [object]GetThread(){
        <# Get execution thread #>
        return Get-WMIObject -Class Win32_Thread
    }
    static [object]GetNetAdapter(){
        <# This method is used to obtain network adapter information on systems before WinServer2012/Win8.1, because Get-NetAdater is not available in these systems. #>
        return Get-WmiObject -Class Win32_NetworkAdapter
    }
    # GetNetAdapter  | ConvertTo-Json
    static [string]GetIpAddress(){
        $items = @{}
        $Name = "_?"
        foreach ($i in (ipconfig|findstr ":")) {
            if ($i.Split(":")[1] -eq ""){
                $Name = ($i.Split(":")[0]).Replace(" ","_")
                $items[$Name] = @{}
            }
            else{
                if($i.Contains("DNS")){
                    $items[$Name]["DNS Suffix"] = ($i.Split(": ")[1].Replace(" ",""))
                }
                if($i.Contains("IPv4")){
                    $items[$Name]["IPv4"] = ($i.Split(":")[1].Replace(" ",""))
                }
                if($i.Contains("IPv6")){
                    $items[$Name]["IPv6"] = ($i.Split(": ")[1].Replace(" ",""))
                }
            }
        }
        return $items
    }
    static [object]GetNetAdapterByDeviceID([int]$DeviceID){
        return Get-WMIObject -class Win32_NetworkAdapter -Filter DeviceID=$DeviceID
    }
    static [object]GetNetAdapterByName([string]$Name){
        return Get-WMIObject -class Win32_NetworkAdapter -Filter Name=$Name
    }
    static [object]GetNetAdapterByMACAddress([string]$MACAddress){
        return Get-WMIObject -class Win32_NetworkAdapter -Filter MACAddress=$MACAddress
    }
    static [object]GetVolume(){
        <# Get the storage area on the computer #>
        return Get-WmiObject -Class Win32_Volume
    }
    static [object]GetMemoryInfos(){
        $PhysicalMemory = Get-WmiObject -Class Win32_PhysicalMemory
        $free_total = ([math]::round(((Get-WmiObject -Class Win32_OperatingSystem).FreePhysicalMemory / (1mb)), 2))
        $Speed = @($PhysicalMemory.Speed);
        $Speed_Average = [math]::round((($PhysicalMemory.Capacity | Measure-Object -Average).Average /1000000),1)
        $capacity_total = [math]::round((($PhysicalMemory.Capacity | Measure-Object -Sum).Sum /1gb))
        return @{
            Capacitys = $PhysicalMemory.Capacity;
            Speeds=$Speed;
            Speed_Average = $Speed_Average
            Capacity_total = $capacity_total.ToString()+' Gb';
            Free_total = $free_total.ToString()+' Gb';
            Usage_Rate = ([math]::round(($capacity_total-$free_total)/$capacity_total, 2)).ToString() + '%'
        }
    }
    static [object]GetLocalTime(){
        <# This method is used to obtain the local time of the computer #>
        return Get-WmiObject -Class Win32_LocalTime
    }
    static [object]GetSessionProcess(){
        <# Get the association between the login session and the process associated with the session #>
        return Get-WmiObject -Class Win32_SessionProcess
    }
    static [object]GetSystemAccount(){
        <# Get Windows system account #>
        return Get-WmiObject -Class Win32_SystemAccount
    }
    static [object]GetUserAccount(){
        <# Get user account information on Windows system #>
        return Get-WmiObject -Class Win32_UserAccount
    }
    static [object]GetStartupCommand(){
        <# Get the command that runs automatically when the user logs in to the computer #>
        return Get-WmiObject -Class Win32_StartupCommand
    }
    static [object]GetUserInDomain(){
        <# Get associated user account and Windows NT domain #>
        return Get-WmiObject -Class Win32_UserInDomain
    }
    static [object]GetNTLogEvent(){
        <# Get Windows events #>
        return Get-WmiObject -Class Win32_NTLogEvent
    }
    static [object]GetNTEventLogFile(){
        <# Get the data stored in the windows event log #>
        return Get-WmiObject -Class Win32_NTEventLogFile
    }
    static [object]GetDiskPartition(){
        <# Get the function and management capacity of the physical disk partition area on the computer system running Windows. #>
        return Get-WmiObject -Class Win32_DiskPartition
    }
    static [object]GetDiskUsage() {
        <# Get all partition usage #>
        $logicaldisk = Get-WmiObject -Class Win32_Logicaldisk
        $disk_info=@{}
        foreach ($i in $logicaldisk) {
            $DeviceID = ($i.DeviceID).ToString();
            if($DeviceID -ne $null){
                $disk_info[$DeviceID] = @{}
                if(($i.Size -ne 0) -and  ($i.Size -ne $null)){
                    $disk_info[$DeviceID]['Total'] = ($i.Size/1073741824).ToString().Substring(0,5)+"Gb";
                    $disk_info[$DeviceID]['Free'] = ($i.FreeSpace/1073741824).ToString().Substring(0,5)+"Gb";
                    $disk_info[$DeviceID]['Usage'] = ((($i.Size-$i.FreeSpace) / $i.Size)*100).ToString().Substring(0,5)+"%"
                }else{
                    $disk_info[$DeviceID]['Total'] = $null
                    $disk_info[$DeviceID]['Free'] = $null
                    $disk_info[$DeviceID]['Usage'] = $null
                }
            }  
        }
        return $disk_info
    }
    # start menu
    static [object]GetLogicalProgramGroup(){
        <# Get the program group in the computer system running Windows #>
        return Get-WmiObject -Class Win32_LogicalProgramGroup
    }
    static [object]GetLogicalProgramGroupDirectory(){
        <# Associating logical program groups (grouping them into the Start menu) and the file directory where they are stored #>
        return Get-WmiObject -Class Win32_LogicalProgramGroupDirectory
    }
    static [object]GetLogicalProgramGroupItem(){
        <# Represents an element contained by a Win32_ProgramGroup instance, which is not another Win32_ProgramGroup instance #>
        return Get-WmiObject -Class Win32_LogicalProgramGroupItem
    }
    static [object]GetLogicalProgramGroupItemDataFile(){
        <# Associates the program group items in the Start menu with the files stored in them #>
        return Get-WmiObject -Class Win32_LogicalProgramGroupItemDataFile
    }
    static [object]GetProgramGroupContents(){
        <# Associates the sequence of program groups and the contained individual program groups or items #>
        return Get-WmiObject -Class Win32_ProgramGroupContents
    }
    static [object]GetProgramGroupOrItem(){
        <# Get the logical grouping of programs on the user's Start menu |Programs menu #>
        return et-WmiObject -Class Win32_ProgramGroupOrItem
    }
}


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
安全 云计算
服务器系统资源不足怎么办
服务器系统资源不足怎么办
33 4
|
2月前
|
弹性计算 监控 数据库
制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程
本文通过一个制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程,展示了企业级应用上云的实践方法与显著优势,包括弹性计算资源、高可靠性、数据安全及降低维护成本等,为企业数字化转型提供参考。
63 5
|
29天前
|
存储 Oracle 安全
服务器数据恢复—LINUX系统删除/格式化的数据恢复流程
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs) 下删除或者格式化的数据恢复流程和可行性。
|
3月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
70 4
|
2天前
|
人工智能 运维 监控
AI辅助的运维流程自动化:实现智能化管理的新篇章
AI辅助的运维流程自动化:实现智能化管理的新篇章
36 22
|
2月前
|
机器学习/深度学习 运维 监控
智能化运维:从自动化到AIOps的演进之路####
本文深入探讨了IT运维领域如何由传统手工操作逐步迈向高度自动化,并进一步向智能化运维(AIOps)转型的过程。不同于常规摘要仅概述内容要点,本摘要将直接引入一个核心观点:随着云计算、大数据及人工智能技术的飞速发展,智能化运维已成为提升企业IT系统稳定性与效率的关键驱动力。文章详细阐述了自动化工具的应用现状、面临的挑战以及AIOps如何通过预测性分析和智能决策支持,实现运维工作的质变,引领读者思考未来运维模式的发展趋势。 ####
|
2月前
|
机器学习/深度学习 数据采集 人工智能
智能化运维:从自动化到AIOps的演进与实践####
本文探讨了智能运维(AIOps)的崛起背景,深入分析了其核心概念、关键技术、应用场景及面临的挑战,并对比了传统IT运维模式,揭示了AIOps如何引领运维管理向更高效、智能的方向迈进。通过实际案例分析,展示了AIOps在不同行业中的应用成效,为读者提供了对未来智能运维趋势的洞察与思考。 ####
96 1
|
2月前
|
机器学习/深度学习 数据采集 人工智能
智能运维:从自动化到AIOps的演进与实践####
本文探讨了智能运维(AIOps)的兴起背景、核心组件及其在现代IT运维中的应用。通过对比传统运维模式,阐述了AIOps如何利用机器学习、大数据分析等技术,实现故障预测、根因分析、自动化修复等功能,从而提升系统稳定性和运维效率。文章还深入分析了实施AIOps面临的挑战与解决方案,并展望了其未来发展趋势。 ####
|
2月前
|
机器学习/深度学习 数据采集 运维
智能化运维:机器学习在故障预测和自动化响应中的应用
智能化运维:机器学习在故障预测和自动化响应中的应用
64 4
|
3月前
|
存储 运维 监控
高效运维:从基础架构到自动化管理的全面指南
【10月更文挑战第11天】 本文将深入探讨如何通过优化基础架构和引入自动化管理来提升企业IT运维效率。我们将从服务器的选择与配置、存储解决方案的评估,到网络的设计与监控,逐一解析每个环节的关键技术点。同时,重点讨论自动化工具在现代运维中的应用,包括配置管理、持续集成与部署(CI/CD)、自动化测试及故障排除等方面。通过实际案例分析,展示这些技术如何协同工作,实现高效的运维管理。无论是IT初学者还是经验丰富的专业人员,都能从中获得有价值的见解和实操经验。
110 1