Powershell 之收集服務器配置

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章