设为首页 收藏本站
查看: 858|回复: 0

Powershell 之收集服务器配置

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-11-24 08:27:34 | 显示全部楼层 |阅读模式
function get-srvinfo
{
<#
.SYNOPSIS
This is a function to collecting servers WMI&registry information.

.DESCRIPTION
1\ parameter -s and -i are optionally, if they have not detected both, script will cover the LocalHost.
2\ parameter -o is optionally, if it's not provided, script will use current path to export result.  

------Example1------
get information from CTSDC0A and export result to d:\output.csv

get-srvinfo -server CTSDC0A -o d:\output.csv
<OR>
get-srvinfo -s CTSDC0A -o d:\output.csv
<OR>
get-srvinfo -i serverlist.txt -o d:\output.csv

------Example2------
get information from CTSDC0A,CTSDC0B,CTSWEB0A and export result to d:\output.csv

get-srvinfo -server CTSDC0A,CTSDC0B,CTSWEB0A -o d:\output.csv
<OR>
get-srvinfo -s CTSDC0A,CTSDC0B,CTSWEB0A -o d:\output.csv
<OR>
get-srvinfo -i serverlist.txt -o d:\output.csv

------Example3------
get localhost information and export result to d:\output.csv

get-srvinfo -output d:\output.csv
OR
get-srvinfo -o d:\output.csv

.PARAMETER server
Specify the remote computer name.

.PARAMETER inputpath
Specify a file path to locate server list.

.PARAMETER outputpath
Specify output CSV file path and name.

.EXAMPLE
1\ get information from CTSDC0A and export result to d:\output.csv
get-srvinfo -computername CTSDC0A -o d:\output.csv
OR
get-srvinfo -i serverlist.txt -o d:\output.csv

.EXAMPLE
2\ get localhost information and export result to d:\output.csv
get-srvinfo -output d:\output.csv
OR
get-srvinfo -o d:\output.csv   

#>

#Define: parameter
Param
(
[alias('s')]$server,
[alias('i')]$inputpath,
[alias('o')]$outputpath
)

#Define: empty arrange to save servers for input
$serverList=@()

#Determine parameter status
if($server -eq $null -and $inputpath -eq $null)
    {
    $serverList =(gwmi win32_computersystem |select-object name).name
    Write-Host “INFORMATION: Not detected any input file or servers, script will run for LocalHost [$serverlist]” -ForegroundColor green  
    }
elseif($server -ne $null -and $inputpath -ne $null)
    {
    Write-Host "ERROR[Parameter]: Please only use one parameter every time for input server list!" -ForegroundColor Red
    break
    }
elseif($server -eq $null)
    {
    $serverList = Get-Content $inputpath
    }
else
    {
    $serverList=$server
    write-host "INFORMATION: Servers [$serverlist] detected!" -ForegroundColor Green
    }
if($outputpath -eq $null)
    {
    $crtpath=[string](get-location)
    $crtdate=(get-date).tostring("yyyy-mm-dd")
    $outputpath="$crtpath\get-srvinfo-output-$crtdate.csv"
    Write-Host "INFORMATION: Output path has not detected!" -ForegroundColor Yellow  
    Write-Host "INFORMATION: Export result in [$outputpath]" -ForegroundColor green
    Write-Host "---------------------------------------------" -ForegroundColor White
    }
else
    {
    Write-Host "INFORMATION: Output path has detected!" -ForegroundColor green
    Write-Host "INFORMATION: Export result in [$outputpath]" -ForegroundColor green
    Write-Host "---------------------------------------------" -ForegroundColor White
    }
#Process: Collecting information,arrange and export result
Foreach ($srv in $serverlist)
    {
    #Determine: try to test connectivity status
    if(test-connection -computername $srv -quiet)
        {
        #Determine: try to get WMI & Registry key value from RPC service
        try
            {
            #Collecting: server and os information
            $baseInfo=gwmi  win32_computersystem -computername $srv -ea "stop"
            $osver=gwmi  win32_operatingsystem -computername $srv -ea "stop"
            
            #Collecting: SQL installation status
            $sqlinststatus=(Get-Service -ComputerName $srv -ea "stop"|Select-Object name |Where-Object {$_.name -eq 'MSSQLSERVER'}).name      
            
            #Collecting: network configuration
            $netConf= gwmi win32_networkadapterconfiguration -namespace "root\cimv2" -computername $srv -ea "stop"|?{$_.ipenabled}
            
            #Collecting: persisted route table records
            $extnetcfg=Gwmi win32_ip4persistedroutetable –computer $srv -ea "stop"

            #Collecting: registry key value
            $regObj = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $srv)
            $regObjASP= $regobj.OpenSubkey("SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\")
            $regObjIIS= $regobj.OpenSubkey("SOFTWARE\Microsoft\inetstp\")
            $regObjUAC= $regobj.OpenSubkey("Software\Microsoft\Windows\CurrentVersion\Policies\System\")
            
            $regObjFWdomain= $regObj.opensubkey("SYSTEM\ControlSet001\services\SharedAccess\Parameters\FirewallPolicy\DomainProfile\")
            $regObjFWpublic= $regObj.opensubkey("SYSTEM\ControlSet001\services\SharedAccess\Parameters\FirewallPolicy\PublicProfile\")
            $regObjFWstandard= $regObj.opensubkey("SYSTEM\ControlSet001\services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\")
            
            #Return: server and os information
            $rsltServerType=$baseinfo.model
            $rsltDomainName=$baseinfo.domain
            $rsltOSversion=$osver.version
            $rsltSPversion=$osver.servicepackmajorversion

            #Determine: SP version
            if ($rsltSPversion -eq 1)
                {
                $rsltSPversion="installed"
                }
            else
                {
                $rsltSPversion="not installed"
                }
            
            #Return: SQL installation status
            #Determine: SQL installation status
            $rsltsqlinststatus=$sqlinststatus
            if ($sqlinststatus -ne $null)
                {
                $rsltsqlinststatus="installed"
                }
            else
                {
                $rsltsqlinststatus="not installed"
                }
            #Return: network configuration
            [string]$rsltIPAddress=$netconf.ipaddress[0]
            [string]$rsltIPSubnet=$netConf.ipsubnet
            [string]$rsltDNSSearchorder=$netconf.dnsserversearchorder
            [string]$rsltNetBIOSstatus=$netconf.tcpipnetbiosoptions
            [string]$rsltDefaultGW=$netconf.defaultipgateway
            
            #Return: persisted route table records
            [string]$rsltPstnRTrecord=$extnetcfg.destination
            
            #Return: registry key value
            #Determine: registry key for ASP.NET version
            if($regobjasp -eq $null)
                {
                $rsltASPNETregValue="N/A"
                }
            elseif($regObjasp.GetValue("install") -eq 1)
                {
                $rsltASPNETregValue="installed"
                }
            else
                {
                $rsltASPNETregValue="not installed"
                }

            #Determine: registry key for IIS version
            if($regobjiis -eq $null)
                {
                $rsltIISVerregValue="N/A"
                }
            else
                {
                $rsltIISVerregValue= $regObjiis.GetValue("versionstring")
                }
                 
            #Determine: registry key for UAC status
            if($regobjuac -eq $null)
                {
                $rsltUACregValue="N/A"
                }
            elseif($regObjuac.GetValue("EnableLUA") -eq 0)
                {
                $rsltUACregValue="Closed"
                }
            else
                {
                $rsltUACregValue="Opened"
                }
            
            #Determine: Firewall status for domain
            if($regObjFWdomain -eq $null)
                {
                $rsltFWdomain="N/A"
                }
            elseif($regobjfwdomain.getvalue("enableFirewall") -eq 1)
                {
                $rsltFWdomain="Opened"
                }
            else
                {
                $rsltFWdomain="Closed"
                }
            
            #Determine: Firewall status for public
            if($regObjFWpublic -eq $null)
                {
                $rsltFWpublic="N/A"
                }
            elseif($regobjfwpublic.getvalue("enableFirewall") -eq 1)
                {
                $rsltFWpublic="Opened"
                }
            else
                {
                $rsltFWpublic="Closed"
                }
            
            #Determine: Firewall status for standard
            if($regObjFWstandard -eq $null)
                {
                $rsltFWstandard="N/A"
                }
            elseif($regObjFWstandard.getvalue("enableFirewall") -eq 1)
                {
                $rsltFWstandard="Opened"
                }
            else
                {
                $rsltFWstandard="Closed"
                }
                 
            #Update: total status
            $rsltTotalStatus="INFO:No issue found"
            
            #Print: status for current server
            Write-Host "[ $srv ]INFO: No issue found" -ForegroundColor Green
            
            }
        catch
            {
            #Print: status for current server
            Write-Host "[ $srv ]ISSUE: RPC unavailable" -ForegroundColor Red
            
            #Update: total status and all object properties
            $rsltTotalStatus="ISSUE: RPC unavailable"
            $rsltServerType="N/A"
            $rsltDomainName="N/A"
            $rsltOSversion="N/A"
            $rsltSPVersion="N/A"
            $rsltsqlinststatus="N/A"
            $rsltASPNETregValue="N/A"
            $rsltIISVerregValue="N/A"
            $rsltUACregValue=“N/A”
            $rsltFWdomain="N/A"
            $rsltFWpublic="N/A"
            $rsltFWstandard="N/A"

            $rsltIPAddress="N/A"
            $rsltIPSubnet="N/A"
            $rsltDNSSearchorder="N/A"
            $rsltNetBIOSstatus="N/A"
            $rsltDefaultGW="N/A"

            $rsltPstnRTrecord="N/A"
            }
        }
    else
        {
        #Print: status for current server
        Write-Host "[ $srv ]ISSUE:Connectivity" -ForegroundColor Red
         
        #Update: total status and all object properties
        $rsltTotalStatus="ISSUE:Connectivity"
        $rsltServerType="N/A"
        $rsltDomainName="N/A"
        $rsltOSversion="N/A"
        $rsltSPVersion="N/A"
        $rsltsqlinststatus="N/A"
        $rsltASPNETregValue="N/A"
        $rsltIISVerregValue="N/A"
        $rsltuacregValue="N/A"
        $rsltFWdomain="N/A"
        $rsltFWpublic="N/A"
        $rsltFWstandard="N/A"

        $rsltIPAddress="N/A"
        $rsltIPSubnet="N/A"
        $rsltDNSSearchorder="N/A"
        $rsltNetBIOSstatus="N/A"
        $rsltDefaultGW="N/A"

        $rsltPstnRTrecord="N/A"
        }

    #Arrange: all information
    $arrangeInfo = New-Object object
    Add-Member -MemberType NoteProperty -Name ServerName -Value $srv -InputObject $arrangeInfo
    Add-Member -MemberType NoteProperty -Name TotalStatus -Value $rsltTotalStatus -InputObject $arrangeInfo
    Add-Member -MemberType NoteProperty -Name ServerType -Value $rsltServerType -InputObject $arrangeInfo
    Add-Member -MemberType NoteProperty -Name DomainName -Value $rsltDomainName -InputObject $arrangeInfo
    Add-Member -MemberType NoteProperty -Name OSVersion -Value $rsltOSversion -InputObject $arrangeInfo
    Add-Member -MemberType NoteProperty -Name SPVersion -Value $rsltSPVersion -InputObject $arrangeInfo
    Add-Member -MemberType NoteProperty -Name SQLInstStatus -Value $rsltsqlinststatus -InputObject $arrangeInfo
    Add-Member -MemberType NoteProperty -Name ASPNETRegValue -Value $rsltASPNETregValue -InputObject $arrangeInfo
    Add-Member -MemberType NoteProperty -Name IISVerRegValue -Value $rsltIISVerregValue -InputObject $arrangeInfo
    Add-Member -MemberType NoteProperty -Name UACRegValue -Value $rsltuacregValue -InputObject $arrangeInfo
    Add-Member -MemberType NoteProperty -Name FireWall:Domain -Value $rsltFWdomain -InputObject $arrangeInfo
    Add-Member -MemberType NoteProperty -Name FireWall:Public -Value $rsltFWpublic -InputObject $arrangeInfo
    Add-Member -MemberType NoteProperty -Name FireWall:Standard -Value $rsltFWstandard -InputObject $arrangeInfo
     
    #Determine: network ocnfiguration
    if($netconf.count -eq $null)
        {
        Add-Member -MemberType NoteProperty -Name IPAddress[0] -Value "$rsltIPAddress" -InputObject $arrangeInfo
        Add-Member -MemberType NoteProperty -Name IPSubnet[0] -Value "$rsltIPSubnet" -InputObject $arrangeInfo
        Add-Member -MemberType NoteProperty -Name DNSSearchorder[0] -Value "$rsltDNSSearchorder" -InputObject $arrangeInfo
        Add-Member -MemberType NoteProperty -Name NetBIOSstatus[0] -Value $rsltNetBIOSstatus -InputObject $arrangeInfo
        Add-Member -MemberType NoteProperty -Name DefaultGW[0] -Value "$rsltDefaultGW" -InputObject $arrangeInfo
        }
    else
        {
        #Process: loop all the ip address
        for ($x=0;$x -lt $netconf.count;$x++)
            {
            [string]$rsltIPAddress=$netconf[$x].ipaddress[0]
            [string]$rsltIPSubnet=$netconf[$x].ipsubnet
            [string]$rsltDefaultGW=$netconf[$x].defaultipgateway
            [string]$rsltDNSSearchorder=$netconf[$x].dnsserversearchorder
            [string]$rsltNetBIOSstatus=$netconf[$x].tcpipnetbiosoptions
            if($rsltDefaultGW -eq $null)
            {
            $rsltDefaultGW="N/A"
            }      
            if($rsltDNSSearchorder -eq $null)
            {
            $rsltDNSSearchorder="N/A"
            }
            if($rsltNetBIOSstatus -eq $null)
            {
            $rsltNetBIOSstatus="N/A"
            }           
            Add-Member -MemberType NoteProperty -Name IPAddress[$x] -Value $rsltIPAddress -InputObject $arrangeInfo
            Add-Member -MemberType NoteProperty -Name IPSubnet[$x] -Value $rsltIPSubnet -InputObject $arrangeInfo
            Add-Member -MemberType NoteProperty -Name DefaultGW[$x] -Value $rsltDefaultGW -InputObject $arrangeInfo
            Add-Member -MemberType NoteProperty -Name DNSSearchorder[$x] -Value $rsltDNSSearchorder -InputObject $arrangeInfo
            Add-Member -MemberType NoteProperty -Name NetBIOSstatus[$x] -Value $rsltNetBIOSstatus -InputObject $arrangeInfo
            }
        }
     
    #Determine: persisted route table records
    if($extnetcfg.count -eq $null)
        {
        Add-Member -MemberType NoteProperty -Name PstnRTrecord[0] -Value $rsltPstnRTrecord -InputObject $arrangeInfo   
        }
    else
        {
        #Process: loop all the persisted route records
        for($y=0;$y -lt $extnetcfg.count;$y++)
            {
            [string]$rsltPstnRTrecord=$extnetcfg[$y].destination
            Add-Member -MemberType NoteProperty -Name PstnRTrecord[$y] -Value $rsltPstnRTrecord -InputObject $arrangeInfo  
            }
        }
     
    #Arrange: total result
    $exportinfo += @($arrangeInfo)
     
    #Export: total result
    $exportinfo |Export-Csv $outputpath -notypeinformation
    }
}

get-srvinfo



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-304691-1-1.html 上篇帖子: Powershell 之POP3邮件管理 下篇帖子: PowerShell 给现有DNS记录创建PTR反向查询 服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表