class Inspec::Resources::WindowsSrv

Uses Powershell to retrieve the information
Determine the service state from Windows

def info(service_name)

- 7: Paused
- 6: Pause Pending
- 5: Continue Pending
- 4: Running
- 3: Stopping
- 2: Starting
- 1: Stopped
@see: https://msdn.microsoft.com/en-us/library/windows/desktop/ms685996(v=vs.85).aspx
Windows Services have the following status code:

}
"Status": "OK"
"State": "Running",
"StartMode": "Auto",
"Name": "Dhcp",
{
erty Name, StartMode, State, Status | ConvertTo-Json
PS: Get-WmiObject -Class Win32_Service | Where-Object {$_.Name -eq $name -or $_.DisplayName -eq $name} | Select-Object -Prop
Use the following powershell to determine the start mode
Also see: https://msdn.microsoft.com/en-us/library/aa384896(v=vs.85).aspx
@see: https://connect.microsoft.com/PowerShell/feedback/details/424948/i-would-like-to-see-the-property-starttype-added-to-get-services
Until StartMode is not added to Get-Service, we need to do a workaround

}
"Status": 4
"DisplayName": "DHCP Client",
"Name": "dhcp",
{
PS: Get-Service -Name 'dhcp'| Select-Object -Property Name, DisplayName, Status | ConvertTo-Json
Determine service details
def info(service_name)
  cmd = inspec.command("New-Object -Type PSObject | Add-Member -MemberType NoteProperty -Name Service -Value (Get-Service -Name '#{service_name}'| Select-Object -Property Name, DisplayName, Status) -PassThru | Add-Member -MemberType NoteProperty -Name WMI -Value (Get-WmiObject -Class Win32_Service | Where-Object {$_.Name -eq '#{service_name}' -or $_.DisplayName -eq '#{service_name}'} | Select-Object -Property StartMode) -PassThru | ConvertTo-Json")
  # cannot rely on exit code for now, successful command returns exit code 1
  # return nil if cmd.exit_status != 0
  # try to parse json
  begin
    service = JSON.parse(cmd.stdout)
  rescue JSON::ParserError => _e
    return nil
  end
  # check that we got a response
  return nil if service.nil? || service['Service'].nil?
  {
    name: service['Service']['Name'],
    description: service['Service']['DisplayName'],
    installed: true,
    running: service_running?(service),
    enabled: service_enabled?(service),
    startmode: service['WMI']['StartMode'],
    type: 'windows',
  }
end

def service_enabled?(service)

detect if service is enabled
def service_enabled?(service)
  !service['WMI'].nil? &&
    !service['WMI']['StartMode'].nil? &&
    (service['WMI']['StartMode'] == 'Auto' ||
    service['WMI']['StartMode'] == 'Manual')
end

def service_running?(service)

detect if service is running
def service_running?(service)
  !service['Service']['Status'].nil? && service['Service']['Status'] == 4
end