开发者

Can't stop a service using vbscript

I'm using the following code to try to stop a service. I can display the service state using WScript.Echo objService.State so I know I have the right service name and that it can find it and determine its state as running or stopped but when I run this script I get an Error on Line 51: Error Not Found Code 80041002 (see screenshot)

The line of code at 51 is:

 objService.StopService()

Where am I going wrong? I can stop and start this via the command line using sc.exe and am able to control other services ie Alerter but as soon as I try to control this particular service it fails.

Thanks

EDIT The full code from the script (Thanks Brandon Moretz who pointed out that I hadn't posted the full code so the Line number didn't mean anything & I have changed the StartService() back to Stop as it originally was so now you have more to go on. Sorry!)

' 1. Check that the latest backup zip exists and store its name in LBZ (LatestBackupZip)
' 2. Stop the Livecontent Service
' 3. Remove .dbx, .lck and .log files from DataFolder
' 4. restart the service
' 5. Restore the database

Dim fileNewest
Dim fso
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell") 
'Set ImportFldr = fso.GetFolder("C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data\Import")
Set ImportFldr = fso.GetFolder("C:\Program Files\XyEnterprise\SDL LiveContent\data\export")
'Set DataFldr = fso.GetFolder("C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data")
Set DataFldr = fso.GetFolder("C:\Program Files\XyEnterprise\SDL LiveContent\data")

For Each aFile In ImportFldr.Files
sExtension = fso.GetExtensionName(aFile.Name)
    If sExtension = "log" Then
            'Msgbox "The file extension is a " & sExtension
        Else
            'Msgbox "The file extension is a " & sExtension
                         If fileNewest = "" Then
                        Set fileNewest = aFile  
                     Else
                     'If fileNewest.DateCreated < aFile.DateCreated Then
                        If CDate(fileNewest.DateCreated) < CDate(aFile.DateCreated) Then

                            Set fileNewest = aFile
                     End If
                    End If
                End If
Next
Msgbox "The Newest File in the folder is " & fileNewest.Name & chr(13) & "Size: " & fileNewest.Size & " bytes" & chr(13) & "Was last modified on " & FileNewest.DateLastModified 

' Change to /Data
'WScript.Echo WshShell.CurrentDirectory 
WshShell.CurrentDirectory = DataFldr
'WScript.Echo WshShell.CurrentDirectory 

' Stop the Livecontent service
strComputer = "."
Dim objService
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set colServiceList = objWMIService.ExecQuery _
    ("Select * from Win32_Service where Name = 'LiveContent'")

For Each objService in colServiceList
WScript.Echo objService.State
    If objService.State = "Running" Then
        objService.StopService()
        'Wscript.Sleep 5000
    End If 
Next


'Dim objShell
'Set objShell = CreateObject("WScript.Shell")
'objShell.Run "%comspec% /k c: & cd ""C:\Program Files (x86)\XyEnterprise\SDL LiveContent\"" & """"loaddb RESTORE -'Dlc.file=C:\PROGRA~2\XYENTE~1\SDLLIV~1\data\Import\" & fileNewest.Name & " -Dlc.pswd=N2kAs72z"""""

Can't stop a service using vbscript

LATEST EDIT

I have taken your code and still can't get it to work. I noticed that the line:

Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")

was missing a \ at "winmgmts:\" which I have added and I like your check to see if there is an (x86) directory as I am testing this on a 32bit server but will move it over to a 64 when it is ready so that will work nicely.

Also this section didn't work:

If fso.FolderExists( "C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data" ) Then
    Set DataFldr= fso.GetFolder("C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data")
Else If fso.GetFolder("C:\Program diles\XyEnterprise\SDL LiveContent\data") Then
    Set DataFldr= fso.GetFolder("C:\Program diles\XyEnterprise\SDL LiveContent\data")
End If

But did if I changed the ElseIf fso.GetFolder to fso.FolderExists

The script runs fine if I comment out Line 78

objService.StopService()

But as soon as I uncomment it I get an error:

Line: 78

Char: 9

Error: Not found Code: 80041002 Source: SWbemObjectEx

But the Service can be found as the line: WScript.Echo objService.State Echos its state to the screen.

Really confuzzled now.

' 1. Check that the latest backup zip exists and store its name in LBZ (LatestBackupZip)
' 2. Stop the Livecontent Service
' 3. Remove .dbx, .lck and .log files from DataFolder
' 4. restart the service
' 5. Restore the database

Dim fileNewest
Dim ImportFldr
Dim DataFldr
Dim fso
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")


If fso.FolderExists( "C:\Program Files\XyEnterprise\SDL LiveContent\data\Import" ) Then
    Set ImportFldr = fso.GetFolder("C:\Program Files\XyEnterprise\SDL LiveContent\data\Import")
  Else 
    WScript.Echo "Warning: Import Directory can not be found"   
End If

If fso.FolderExists( "C:\Program Files\XyEnterprise\SDL LiveContent\data\export" ) Then
    Set ImportFldr = fso.GetFolder("C:\Program Files\XyEnterprise\SDL LiveContent\data\export")
Else 
    WScript.Echo "Warning: Export Directory can not be found"   
End If
If fso.FolderExists( "C:\Program Files\XyEnterprise\SDL LiveContent\data" ) Then
    Set DataFldr= fso.GetFolder("C:\Program Files\XyEnterprise\SDL LiveContent\data")
Else 
    WScript.Echo "Warning: Data Directory can not be found"     
End If    



For Each aFile In ImportFldr.Files
    sExtension = fso.GetExtensionName(aFile.Name)


If sExtension = "log" Then
        'Msgbox "The file extension is a " & sExtension
    Else
        'Msgbox "The file extension is a " & sExtension
                If fileNewest = "" Then
                    Set fileNewest = aFile  
                Else
       开发者_如何学JAVA             If fileNewest.DateCreated < aFile.DateCreated Then
                        If CDate(fileNewest.DateCreated) < CDate(aFile.DateCreated) Then
                            Set fileNewest = aFile
                        End If
                    End If
                End If
    End If

Next
'Msgbox "The Newest File in the folder is " & fileNewest.Name & chr(13) & "Size: " & fileNewest.Size & " bytes" & chr(13) & "Was last modified on " & FileNewest.DateLastModified


' Change to /Data
WScript.Echo WshShell.CurrentDirectory
WshShell.CurrentDirectory = DataFldr
WScript.Echo WshShell.CurrentDirectory


' Stop the Livecontent service




strComputer = "."
Dim objService
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
    ("Select * from Win32_Service where Name = 'LiveContent'")

For Each objService in colServiceList
WScript.Echo objService.State
    If objService.State = "Running" Then
        objService.StopService()
        WScript.Echo objService.State
        Wscript.Sleep 5000
    End If
Next

EDIT 2

After very extensive testing we have come to the conclusion that there is nothing wrong with the script, it is just that this particular service will not stop with this method.

To this end we have moved on and are now using

objShell.Run "sc start LiveContent"

And this works a treat.

Thanks to Brandon for your help.


There are a couple of minor issues:

1.) Not checking for if a folder exists for calling get folder, this is what was causing your 'Not Found' error.

2.) Non-matching If ... Then & End statements in your file loop. (I would probably choose a better editor for vbscript, programmers notepad and notepad++ are very useful.)

3.) The StartService() / StopService() mix-up I mentioned previously.


' 1. Check that the latest backup zip exists and store its name in LBZ (LatestBackupZip)
' 2. Stop the Livecontent Service
' 3. Remove .dbx, .lck and .log files from DataFolder
' 4. restart the service
' 5. Restore the database

Dim fileNewest

Dim fso Set fso = WScript.CreateObject("Scripting.FileSystemObject")

Set WshShell = WScript.CreateObject("WScript.Shell")

Dim ImportFldr

If fso.FolderExists( "C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data\Import" ) Then Set ImportFldr = fso.GetFolder("C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data\Import") Else If fso.FolderExists( "C:\Program Files\XyEnterprise\SDL LiveContent\data\export" ) Then Set ImportFldr = fso.GetFolder("C:\Program Files\XyEnterprise\SDL LiveContent\data\export") End If

Dim DataFldr

If fso.FolderExists( "C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data" ) Then Set DataFldr= fso.GetFolder("C:\Program Files (x86)\XyEnterprise\SDL LiveContent\data") Else If fso.GetFolder("C:\Program diles\XyEnterprise\SDL LiveContent\data") Then Set DataFldr= fso.GetFolder("C:\Program diles\XyEnterprise\SDL LiveContent\data") End If

For Each aFile In ImportFldr.Files sExtension = fso.GetExtensionName(aFile.Name)

If sExtension = "log" Then
        'Msgbox "The file extension is a " & sExtension
    Else
        'Msgbox "The file extension is a " & sExtension
                If fileNewest = "" Then
                    Set fileNewest = aFile  
                Else
                    If fileNewest.DateCreated < aFile.DateCreated Then
                        If CDate(fileNewest.DateCreated) < CDate(aFile.DateCreated) Then
                            Set fileNewest = aFile
                        End If
                    End If
                End If
    End If

Next Msgbox "The Newest File in the folder is " & fileNewest.Name & chr(13) & "Size: " & fileNewest.Size & " bytes" & chr(13) & "Was last modified on " & FileNewest.DateLastModified

' Change to /Data 'WScript.Echo WshShell.CurrentDirectory WshShell.CurrentDirectory = DataFldr 'WScript.Echo WshShell.CurrentDirectory

' Stop the Livecontent service strComputer = "." Dim objService Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")

Set colServiceList = objWMIService.ExecQuery _ ("Select * from Win32_Service where Name = 'LiveContent'")

For Each objService in colServiceList WScript.Echo objService.State If objService.State = "Running" Then objService.StopService() 'Wscript.Sleep 5000 End If Next

'Dim objShell 'Set objShell = CreateObject("WScript.Shell") 'objShell.Run "%comspec% /k c: & cd ""C:\Program Files (x86)\XyEnterprise\SDL LiveContent\"" & """"loaddb RESTORE -'Dlc.file=C:\PROGRA~2\XYENTE~1\SDLLIV~1\data\Import\" & fileNewest.Name & " -Dlc.pswd=N2kAs72z"""""


After very extensive testing we have come to the conclusion that there is nothing wrong with the script as it starts and stops other services, it is just that this particular service will not stop with this method.

To this end we have moved on and are now using

objShell.Run "sc start LiveContent"

And this works a treat.

Thanks to Brandon for your help.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜