Jump to content

GenServList


ripdad
 Share

Recommended Posts

Maybe somebody can use this ...

Writes current list and details of services to inifile and retrieves for various uses like compare before and after.

(Tested on XP)

; File: GenServList.au3
; Writes current list and details of services to inifile and retrieves for various uses like compare before and after.
; Released: April 12, 2010
; UDF's by: GEOSoft
; Script by: ripdad
; Version: 0.5 - April 14, 2010
;
#include <Array.au3>
;
$answer = MsgBox(36, 'GenServList', 'Generate Services List ?  ')
If $answer = 7 Then Exit
;
Global $output[1][1]
Global $input = (@ScriptDir & '\ServicesList#' & @YEAR & @MON & @MDAY & '#' & @HOUR & @MIN & @SEC & '.ini')
Global $oFile = FileOpen($input, 1)
Sleep(1000)
;
; Write service items header (1 thru 17) to Ini
$sData = '[Service]' & @CRLF & '1=System Name' & @CRLF & '2=Name' & @CRLF & _
        '3=Type' & @CRLF & '4=State' & @CRLF & '5=ExitCode' & @CRLF & _
        '6=Process ID' & @CRLF & '7=Can Pause' & @CRLF & '8=Can Stop' & @CRLF & _
        '9=Caption' & @CRLF & '10=Description' & @CRLF & '11=Interact DeskTop' & @CRLF & _
        '12=Display Name' & @CRLF & '13=Error Control' & @CRLF & '14=Exec File Path' & @CRLF & _
        '15=Started' & @CRLF & '16=Start Mode' & @CRLF & '17=Account' & @CRLF
FileWrite($oFile, $sData)
;
_ServIniList()
; Author: ripdad
; Reads Services and Details (via UDF's) - then writes resulting data to Ini
Func _ServIniList()
    Local $count = 0
    Local $abs = _ServListInstalled()
    For $i = 1 To $abs[0]
        FileWrite($oFile, @CRLF & '[' & $abs[$i] & ']' & @CRLF)
        TrayTip('Generating Services List', $abs[$i], 1, 1)
        Local $ls = _ServGetDetails($abs[$i])
        For $j = 1 To $ls[0]
            $count += 1
            FileWrite($oFile, $count & '=' & $ls[$j] & @CRLF)
        Next
        $count = 0
    Next
    FileClose($oFile)
    TrayTip('Generating Services List', 'Done  ', 1, 1)
    Sleep(1000)
    TrayTip('', '', 1, 1)
EndFunc
;
; We have a copy of the current services/data on the hard drive.
; Now, we'll retrieve the data from the ini to use in an array.
;
_Ini2Array_Rows()
; Author: ripdad
; Works with standard ini
; Updated: April 12, 2010
Func _Ini2Array_Rows()
    Local $ct, $sn, $rs
    Local $MaxKeyCt = 0
    Local $sn_tick = 0
    $sn = IniReadSectionNames($input)
    While 1
        $sn_tick += 1
        $rs = IniReadSection($input, $sn[$sn_tick])
        If @error = 1 Then ContinueLoop
        If $rs[0][0] > $MaxKeyCt Then $MaxKeyCt = $rs[0][0]
        If $sn_tick = $sn[0] Then ExitLoop
    WEnd
    ReDim $output[$sn[0]][$MaxKeyCt + 1]
    $sn_tick = 0
    While 1
        $sn_tick += 1
        $rs = IniReadSection($input, $sn[$sn_tick])
        If @error = 1 Then
            $output[$sn_tick - 1][0] = $sn[$sn_tick]
            ContinueLoop
        EndIf
        For $ct = 1 To $rs[0][0]
            $output[$sn_tick - 1][$ct] = $rs[$ct][1]
        Next
        $output[$sn_tick - 1][0] = $sn[$sn_tick]
        If $sn_tick = $sn[0] Then ExitLoop
    WEnd
    MsgBox(64, 'GenServList', 'Total Number of Installed Services: ' & $sn[0] - 1)
    Return $output
EndFunc
;
ShellExecute($input); view the inifile
Sleep(2000)
_ArrayDisplay($output, "Result"); view the array
Exit
;
;===============================================================================
; Description:   List the currently installed services
; Syntax:   _ServListInstalled([,$Computer])
; Parameter(s):   $Computer - The network name of the computer (optional) The local computer is default
; Requirement(s):   None
; Return Value(s):   Success - Returns array with list of services
; Author(s)   GEOSoft
; Modification(s):
; Note(s):
; Example(s):
;===============================================================================
Func _ServListInstalled($Computer = ".")
    Local $Rtn = ''
    $Service = ObjGet("winmgmts:\\" & $Computer & "\root\cimv2")
    $sItems = $Service.ExecQuery("Select * from Win32_Service")
    For $objService In $sItems
        $Rtn &= $objService.Name & '|'
    Next
    Return StringSplit(StringTrimRight($Rtn, 1), '|')
EndFunc
;
;===============================================================================
; Description:   Return the details of a Windows Service
; Syntax:   _ServGetDetails($iName[, $Computer])
; Parameter(s):   $iName - The name of the service to check
;                            $Computer - The network name of the computer (optional) The local computer is default
; Requirement(s):   None
; Return Value(s):   Success - Returns an array of the service details where element (-1 = Yes, 0 = No)
;                                    [1] = Computer Network Name
;                                    [2] = Service Name
;                                    [3] = Service Type (Own Process, Share Process)
;                                    [4] = Service State (Stopped, Running, Paused)
;                                    [5] = Exit Code (0, 1077)
;                                    [6] = Process ID
;                                    [7] = Can Be Paused (-1, 0)
;                                    [8] = Can Be Stopped (-1, 0)
;                                    [9] = Caption
;                                    [10] = Description
;                                    [11] = Can Interact With Desktop (-1, 0)
;                                    [12] = Display Name
;                                    [13] = Error Control (Normal, Ignore)
;                                    [14] = Executable Path Name
;                                    [15] = Service Started (-1, 0)
;                                    [16] = Start Mode (Auto, Manual, Disabled)
;                                    [17] = Account Name (LocalSystem, NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService)
;                                Failure Sets @Error = -1 if service not found
; Author(s)   GEOSoft
; Modification(s):
; Note(s):
; Example(s):   $Var = _ServGetDetails("ATI Smart")
;                         $Dtl = "System Name|Name|Type|State|ExitCode|Process ID|Can Pause|Can Stop|Caption|Description|"
;                         $Dtl = StringSplit($Dtl & "Interact With DskTop|Display Name|Error Control|Exec File Path|Started|Start Mode|Account", '|')
;                         For $I = 1 To $Var[0]
;                         MsgBox(4096,$Dtl[$I], $Var[$I])
;                         Next
;===============================================================================
Func _ServGetDetails($iName, $Computer = ".")
    Local $Rtn = ''
    $Service = ObjGet("winmgmts:\\" & $Computer & "\root\cimv2")
    $sItems = $Service.ExecQuery("Select * from Win32_Service")
    For $objService In $sItems
        If $objService.Name == $iName Then
            $Rtn &= $objService.SystemName & '|' & $objService.Name & '|' & $objService.ServiceType & '|' & $objService.State & '|'
            $Rtn &= $objService.ExitCode & '|' & $objService.ProcessID & '|' & $objService.AcceptPause & '|' & $objService.AcceptStop & '|'
            $Rtn &= $objService.Caption & '|' & $objService.Description & '|' & $objService.DesktopInteract & '|' & $objService.DisplayName & '|'
            $Rtn &= $objService.ErrorControl & '|' & $objService.PathName & '|' & $objService.Started & '|' & $objService.StartMode & '|'
            $Rtn &= $objService.StartName
            Return StringSplit($Rtn, '|')
        EndIf
    Next
    Return SetError(-1)
EndFunc
;

April 14, 2010 - Added Date & Time Code to inifile. Removed FileExists code. (not needed anymore)

GenServList.au3

Edited by ripdad

"The mediocre teacher tells. The Good teacher explains. The superior teacher demonstrates. The great teacher inspires." -William Arthur Ward

Link to comment
Share on other sites

  • 2 years later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...