Author Posts

February 24, 2016 at 5:19 am

Hi All, I'm having issues with my code, I'm specifying parameter set names but they don't seem to be working anymore.

 Get-NTService -ComputerName MYSERVER -StartMode Auto
	
	.OUTPUTS
		System.String, System.String
	
	.NOTES
		Additional information about the function.
#>
function Get-NTService
{
	[CmdletBinding(DefaultParameterSetName = 'Default')]
	[OutputType([System.String], ParameterSetName = 'Default')]
	[OutputType([System.String], ParameterSetName = 'Service')]
	[OutputType([System.String], ParameterSetName = 'Summary')]
	[OutputType([System.String], ParameterSetName = 'StartMode')]
	[OutputType([System.Object])]
	param
	(
		[Parameter(ParameterSetName = 'Default',
				   Mandatory = $false,
				   ValueFromPipeline = $true,
				   ValueFromPipelineByPropertyName = $true)]
		[Parameter(ParameterSetName = 'Service')]
		[Parameter(ParameterSetName = 'Summary')]
		[Parameter(ParameterSetName = 'StartMode')]
		[Alias('Server')]
		[System.String]$ComputerName = 'localhost',
		[Parameter(ParameterSetName = 'Default')]
		[Parameter(ParameterSetName = 'StartMode')]
		[Parameter(ParameterSetName = 'Service')]
		[ValidateSet('Auto', 'AutoNotRunning', 'Manual', 'All', IgnoreCase = $true)]
		[System.String]$StartMode = 'All',
		[Parameter(ParameterSetName = 'Summary')]
		[switch]$Summary,
		[Parameter(ParameterSetName = 'Service')]
		[Parameter(ParameterSetName = 'StartMode')]
		[Parameter(ParameterSetName = 'Default')]
		[System.String]$ServiceName,
		[Parameter(ParameterSetName = 'Service',
				   Mandatory = $false)]
		[Parameter(ParameterSetName = 'Default')]
		[Parameter(ParameterSetName = 'StartMode')]
		[ValidateSet('Start', 'Stop', 'Restart', 'Pause', 'Resume', 'Interrogate')]
		[System.String]$Action = 'Interrogate',
		[Parameter(ParameterSetName = 'StartMode')]
		[Parameter(ParameterSetName = 'Service')]
		[Parameter(ParameterSetName = 'Default')]
		[ValidateSet('Automatic', 'Manual', 'Disabled')]
		[System.String]$AlterStartMode
	)
	
	Begin
	{
		
	}
	Process
	{
		# Start Process Block
		switch ($PsCmdlet.ParameterSetName)
		{
			"Default" {
				
				Try
				{
					Write-Verbose "Attempting to gather Service(s) from $($ComputerName)"
					$Services = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
					
					Write-Verbose "Gather Service(s) from $($ComputerName)"
				}
				Catch [System.UnauthorizedAccessException]
				{
					Write-Verbose "Access Denied - Could not connect to $($ComputerName) via WMI"
					Write-Error -Message 'Access Denied - Could not connect via WMI'
					
				}
				Catch [Exception]
				{
					Switch -regex ($Error[0])
					{
						"The RPC server is unavailable" { Write-Verbose "Connection Issue - Could not connect to $($ComputerName) via WMI"; Write-Error -Message 'Connection Issue - Could not connect via WMI' }
						Default { Write-Verbose "Unknown Error - Could not connect to $($ComputerName) via WMI"; Write-Error -Message 'Unknown Error - Could not connect via WMI' }
					}
				}
				Write-Verbose "Building Output Object"
				foreach ($a in $Services)
				{
					$Obj = New-Object -TypeName System.Management.Automation.PSObject
					$Obj | Add-Member -MemberType NoteProperty -Name "Hostname" -Value $a.PSComputerName
					$Obj | Add-Member -MemberType NoteProperty -Name "ServiceName" -Value $a.Name
					$Obj | Add-Member -MemberType NoteProperty -Name "ServiceDescription" -Value $a.Description
					$Obj | Add-Member -MemberType NoteProperty -Name "Status" -Value $a.Status
					$Obj | Add-Member -MemberType NoteProperty -Name "State" -Value $a.State
					$Obj | Add-Member -MemberType NoteProperty -Name "StartMode" -Value $a.StartMode
					
					if ($StartMode -eq "All")
					{
						Write-Output $Obj
					}
					elseif ($StartMode -eq "Auto")
					{
						$Obj = $Obj | Where-Object -Property StartMode -EQ "Auto"
						Write-Output $Obj
					}
					elseif ($StartMode -eq "AutoNotRunning")
					{
						$Obj = $Obj | Where-Object { ($_.StartMode -EQ "Auto") -and ($_.State -notlike "Running") }
						Write-Output $Obj
					}
					elseif ($StartMode -eq "Manual")
					{
						$Obj = $Obj | Where-Object -Property StartMode -EQ "Manual"
						Write-Output $Obj
					}
				}
			}
			"Service" {
				Try
				{
					Write-Verbose "Attempting to verify Service name from $($ComputerName)"
					$Services = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
					$Services = $Services | Where-Object -Property Name -like $ServiceName
					
					switch ($Action)
					{
						"Start" {
							foreach ($b in $Services)
							{
								$Action = $b.StartService() | Out-Null
								$Service = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
								$Results = (if $Action.returnvalue -eq 0 { "Succsess" }	else { "The error value $($Action.returnvalue) was reported" })
								$b = $Service | Where-Object -Property Name -EQ $b.Name
								Write-Verbose "Verified service name from $($ComputerName)"
								$Obj = New-Object -TypeName System.Management.Automation.PSObject
								$Obj | Add-Member -MemberType NoteProperty -Name "Hostname" -Value $b.PSComputerName
								$Obj | Add-Member -MemberType NoteProperty -Name "ServiceName" -Value $b.Name
								$Obj | Add-Member -MemberType NoteProperty -Name "Action" -Value "$Action"
								$Obj | Add-Member -MemberType NoteProperty -Name "Result" -Value "$Result"
								$Obj | Add-Member -MemberType NoteProperty -Name "Status" -Value $b.Status
								$Obj | Add-Member -MemberType NoteProperty -Name "State" -Value $b.State
								$Obj | Add-Member -MemberType NoteProperty -Name "StartMode" -Value $b.StartMode
								Write-Output $Obj
							}
						}
						"Stop" {
							foreach ($b in $Services)
							{
								$Action = $b.StopService() | Out-Null
								$Service = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
								$Results = (if $Action.returnvalue -eq 0 { "Succsess" }	else { "The error value $($Action.returnvalue) was reported" })
								$b = $Service | Where-Object -Property Name -EQ $b.Name
								Write-Verbose "Verified service name from $($ComputerName)"
								$Obj = New-Object -TypeName System.Management.Automation.PSObject
								$Obj | Add-Member -MemberType NoteProperty -Name "Hostname" -Value $b.PSComputerName
								$Obj | Add-Member -MemberType NoteProperty -Name "ServiceName" -Value $b.Name
								$Obj | Add-Member -MemberType NoteProperty -Name "Action" -Value "$Action"
								$Obj | Add-Member -MemberType NoteProperty -Name "Result" -Value "$Result"
								$Obj | Add-Member -MemberType NoteProperty -Name "Status" -Value $b.Status
								$Obj | Add-Member -MemberType NoteProperty -Name "State" -Value $b.State
								$Obj | Add-Member -MemberType NoteProperty -Name "StartMode" -Value $b.StartMode
								Write-Output $Obj
							}
						}
						"Restart" {
							foreach ($b in $Services)
							{
								$Action = $b.StopService() | Out-Null
								$Service = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
								$Results = (if $Action.returnvalue -eq 0 { "Succsess" }	else { "The error value $($Action.returnvalue) was reported" })
								$b = $Service | Where-Object -Property Name -EQ $b.Name
								Write-Verbose "Verified service name from $($ComputerName)"
								$Obj = New-Object -TypeName System.Management.Automation.PSObject
								$Obj | Add-Member -MemberType NoteProperty -Name "Hostname" -Value $b.PSComputerName
								$Obj | Add-Member -MemberType NoteProperty -Name "ServiceName" -Value $b.Name
								$Obj | Add-Member -MemberType NoteProperty -Name "Action" -Value "$Action"
								$Obj | Add-Member -MemberType NoteProperty -Name "Result" -Value "$Result"
								$Obj | Add-Member -MemberType NoteProperty -Name "Status" -Value $b.Status
								$Obj | Add-Member -MemberType NoteProperty -Name "State" -Value $b.State
								$Obj | Add-Member -MemberType NoteProperty -Name "StartMode" -Value $b.StartMode
								Write-Output $Obj
								Write-Output "Restarting Service $ServiceName"
								$Action = $b.StartService() | Out-Null
								$Service = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
								$Results = (if $Action.returnvalue -eq 0 { "Succsess" }	else { "The error value $($Action.returnvalue) was reported" })
								$b = $Service | Where-Object -Property Name -EQ $b.Name
								$Obj = New-Object -TypeName System.Management.Automation.PSObject
								$Obj | Add-Member -MemberType NoteProperty -Name "Hostname" -Value $b.PSComputerName
								$Obj | Add-Member -MemberType NoteProperty -Name "ServiceName" -Value $b.Name
								$Obj | Add-Member -MemberType NoteProperty -Name "Action" -Value "$Action"
								$Obj | Add-Member -MemberType NoteProperty -Name "Result" -Value "$Result"
								$Obj | Add-Member -MemberType NoteProperty -Name "Status" -Value $b.Status
								$Obj | Add-Member -MemberType NoteProperty -Name "State" -Value $b.State
								$Obj | Add-Member -MemberType NoteProperty -Name "StartMode" -Value $b.StartMode
								Write-Output $Obj
							}
							
						}
						"Pause" {
							foreach ($b in $Services)
							{
								$Action = $b.PauseService() | Out-Null
								$Service = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
								$Results = (if $Action.returnvalue -eq 0 { "Succsess" }	else { "The error value $($Action.returnvalue) was reported" })
								$b = $Service | Where-Object -Property Name -EQ $b.Name
								Write-Verbose "Verified service name from $($ComputerName)"
								$Obj = New-Object -TypeName System.Management.Automation.PSObject
								$Obj | Add-Member -MemberType NoteProperty -Name "Hostname" -Value $b.PSComputerName
								$Obj | Add-Member -MemberType NoteProperty -Name "ServiceName" -Value $b.Name
								$Obj | Add-Member -MemberType NoteProperty -Name "Action" -Value "$Action"
								$Obj | Add-Member -MemberType NoteProperty -Name "Result" -Value "$Result"
								$Obj | Add-Member -MemberType NoteProperty -Name "Status" -Value $b.Status
								$Obj | Add-Member -MemberType NoteProperty -Name "State" -Value $b.State
								$Obj | Add-Member -MemberType NoteProperty -Name "StartMode" -Value $b.StartMode
								Write-Output $Obj
							}
							
						}
						"Resume" {
							foreach ($b in $Services)
							{
								$Action = $b.ResumeService() | Out-Null
								$Service = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
								$Results = (if $Action.returnvalue -eq 0 { "Succsess" }	else { "The error value $($Action.returnvalue) was reported" })
								$b = $Service | Where-Object -Property Name -EQ $b.Name
								Write-Verbose "Verified service name from $($ComputerName)"
								$Obj = New-Object -TypeName System.Management.Automation.PSObject
								$Obj | Add-Member -MemberType NoteProperty -Name "Hostname" -Value $b.PSComputerName
								$Obj | Add-Member -MemberType NoteProperty -Name "ServiceName" -Value $b.Name
								$Obj | Add-Member -MemberType NoteProperty -Name "Action" -Value "$Action"
								$Obj | Add-Member -MemberType NoteProperty -Name "Result" -Value "$Result"
								$Obj | Add-Member -MemberType NoteProperty -Name "Status" -Value $b.Status
								$Obj | Add-Member -MemberType NoteProperty -Name "State" -Value $b.State
								$Obj | Add-Member -MemberType NoteProperty -Name "StartMode" -Value $b.StartMode
								Write-Output $Obj
							}
						}
						"Interrogate" {
							foreach ($b in $Services)
							{
								$Action = $b.InterrogateService() | Out-Null
								$Service = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
								$Results = (if $Action.returnvalue -eq 0 { "Succsess" }	else { "The error value $($Action.returnvalue) was reported" })
								$b = $Service | Where-Object -Property Name -EQ $b.Name
								Write-Verbose "Verified service name from $($ComputerName)"
								$Obj = New-Object -TypeName System.Management.Automation.PSObject
								$Obj | Add-Member -MemberType NoteProperty -Name "Hostname" -Value $b.PSComputerName
								$Obj | Add-Member -MemberType NoteProperty -Name "ServiceName" -Value $b.Name
								$Obj | Add-Member -MemberType NoteProperty -Name "Action" -Value "$Action"
								$Obj | Add-Member -MemberType NoteProperty -Name "Result" -Value "$Result"
								$Obj | Add-Member -MemberType NoteProperty -Name "Status" -Value $b.Status
								$Obj | Add-Member -MemberType NoteProperty -Name "State" -Value $b.State
								$Obj | Add-Member -MemberType NoteProperty -Name "StartMode" -Value $b.StartMode
								Write-Output $Obj
							}
						}
						Default { }
					}
				}
				Catch [System.UnauthorizedAccessException]
				{
					Write-Verbose "Access Denied - Could not connect to $($ComputerName) via WMI"
					Write-Error -Message 'Access Denied - Could not connect via WMI'
					$Result = "Failed"
				}
				Catch [Exception]
				{
					Switch -regex ($Error[0])
					{
						"The RPC server is unavailable" { Write-Verbose "Connection Issue - Could not connect to $($ComputerName) via WMI"; Write-Error -Message 'Connection Issue - Could not connect via WMI' }
						Default { Write-Verbose "Unknown Error - Could not connect to $($ComputerName) via WMI"; Write-Error -Message 'Unknown Error - Could not connect via WMI' }
					}
					$Result = "Failed"
				}
			}
			"Summary" {
				
				Try
				{
					Write-Verbose "Attempting to gather Service(s) from $($ComputerName)"
					$Services = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
					
					Write-Verbose "Gather Service(s) from $($ComputerName)"
				}
				Catch [System.UnauthorizedAccessException]
				{
					Write-Verbose "Access Denied - Could not connect to $($ComputerName) via WMI"
					Write-Error -Message 'Access Denied - Could not connect via WMI'
					
				}
				Catch [Exception]
				{
					Switch -regex ($Error[0])
					{
						"The RPC server is unavailable" { Write-Verbose "Connection Issue - Could not connect to $($ComputerName) via WMI"; Write-Error -Message 'Connection Issue - Could not connect via WMI' }
						Default { Write-Verbose "Unknown Error - Could not connect to $($ComputerName) via WMI"; Write-Error -Message 'Unknown Error - Could not connect via WMI' }
					}
				}
				$Obj = New-Object -TypeName System.Management.Automation.PSObject
				$Obj | Add-Member -MemberType NoteProperty -Name "Hostname" -Value $Services[0].PSComputerName
				$Obj | Add-Member -MemberType NoteProperty -Name "TotalServicesCount" -Value $Services.Count
				$Obj | Add-Member -MemberType NoteProperty -Name "AutoStartCount" -Value ($Services | Where-Object -Property StartMode -EQ Auto).count
				$Obj | Add-Member -MemberType NoteProperty -Name "AutoStartButNotRunningCount" -Value ($Services | Where-Object { ($_.StartMode -EQ "Auto") -and ($_.State -notlike "Running") }).count
				
				Write-Output $Obj
			}
			"StartMode" {
				Try
				{
					Write-Verbose "Attempting to verify Service name from $($ComputerName)"
					$Services = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
					$Services = $Services | Where-Object -Property Name -like $ServiceName
					
					switch ($AlterStartMode)
					{
						"Automatic" {
							foreach ($b in $Services)
							{
								$Action = $b.ChangeStartMode("$AlterStartMode") | Out-Null
								$Service = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
								$Results = (if $Action.returnvalue -eq 0 { "Succsess" }	else { "Error $($Action.returnvalue) was reported" })
								$b = $Service | Where-Object -Property Name -EQ $b.Name
								Write-Verbose "Verified service name from $($ComputerName)"
								$Obj = New-Object -TypeName System.Management.Automation.PSObject
								$Obj | Add-Member -MemberType NoteProperty -Name "Hostname" -Value $b.PSComputerName
								$Obj | Add-Member -MemberType NoteProperty -Name "ServiceName" -Value $b.Name
								$Obj | Add-Member -MemberType NoteProperty -Name "Action" -Value "$Action"
								$Obj | Add-Member -MemberType NoteProperty -Name "Result" -Value "$Results"
								$Obj | Add-Member -MemberType NoteProperty -Name "Status" -Value $b.Status
								$Obj | Add-Member -MemberType NoteProperty -Name "State" -Value $b.State
								$Obj | Add-Member -MemberType NoteProperty -Name "StartMode" -Value $b.StartMode
								Write-Output $Obj
							}
						}
						"Disabled" {
							foreach ($b in $Services)
							{
								$b.ChangeStartMode("$AlterStartMode") | Out-Null
								$Service = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
								$Results = (if $Action.returnvalue -eq 0 { "Succsess" }	else { "Error $($Action.returnvalue) was reported" })
								$b = $Service | Where-Object -Property Name -EQ $b.Name
								Write-Verbose "Verified service name from $($ComputerName)"
								$Obj = New-Object -TypeName System.Management.Automation.PSObject
								$Obj | Add-Member -MemberType NoteProperty -Name "Hostname" -Value $b.PSComputerName
								$Obj | Add-Member -MemberType NoteProperty -Name "ServiceName" -Value $b.Name
								$Obj | Add-Member -MemberType NoteProperty -Name "Action" -Value "$Action"
								$Obj | Add-Member -MemberType NoteProperty -Name "Result" -Value "$Results"
								$Obj | Add-Member -MemberType NoteProperty -Name "Status" -Value $b.Status
								$Obj | Add-Member -MemberType NoteProperty -Name "State" -Value $b.State
								$Obj | Add-Member -MemberType NoteProperty -Name "StartMode" -Value $b.StartMode
								Write-Output $Obj
							}
						}
						"Manual" {
							foreach ($b in $Services)
							{
								$b.ChangeStartMode("$AlterStartMode") | Out-Null
								$Service = Get-WmiObject -Class Win32_Service -ComputerName $ComputerName -ErrorAction Stop
								$Results = (if $Action.returnvalue -eq 0 { "Succsess" }	else { "Error $($Action.returnvalue) was reported" })
								$b = $Service | Where-Object -Property Name -EQ $b.Name
								Write-Verbose "Verified service name from $($ComputerName)"
								$Obj = New-Object -TypeName System.Management.Automation.PSObject
								$Obj | Add-Member -MemberType NoteProperty -Name "Hostname" -Value $b.PSComputerName
								$Obj | Add-Member -MemberType NoteProperty -Name "ServiceName" -Value $b.Name
								$Obj | Add-Member -MemberType NoteProperty -Name "Action" -Value "$Action"
								$Obj | Add-Member -MemberType NoteProperty -Name "Result" -Value "$Results"
								$Obj | Add-Member -MemberType NoteProperty -Name "Status" -Value $b.Status
								$Obj | Add-Member -MemberType NoteProperty -Name "State" -Value $b.State
								$Obj | Add-Member -MemberType NoteProperty -Name "StartMode" -Value $b.StartMode
								Write-Output $Obj
							}
						}
						Default { }
					}
				}
				Catch [System.UnauthorizedAccessException]
				{
					Write-Verbose "Access Denied - Could not connect to $($ComputerName) via WMI"
					Write-Error -Message 'Access Denied - Could not connect via WMI'
					$Result = "Failed"
				}
				Catch [Exception]
				{
					Switch -regex ($Error[0])
					{
						"The RPC server is unavailable" { Write-Verbose "Connection Issue - Could not connect to $($ComputerName) via WMI"; Write-Error -Message 'Connection Issue - Could not connect via WMI' }
						Default { Write-Verbose "Unknown Error - Could not connect to $($ComputerName) via WMI"; Write-Error -Message 'Unknown Error - Could not connect via WMI' }
					}
					$Result = "Failed"
				}
			}
		}
	} # End Process Block
	End
	{
		
	}
}

February 24, 2016 at 5:34 am

Looks okay to me. Can you be more specific about what you mean by "don't seem to be working anymore"?

February 24, 2016 at 7:13 am

It seems to be ignoring the set and just using default

February 25, 2016 at 12:10 am

All parameter sets excluding Summary have the same parameters. what the catch ?
How PS should determine what parameter set to use?

February 25, 2016 at 7:19 am

Heh, I didn't even notice that. 🙂