Advertisement

04.10.2007 at 07:55AM PDT, ID: 22501873
[x]
Attachment Details
[x]
The Solution Rating System

With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.

  • The Grade of the Solution
  • The Zone Rank of the Expert Providing the Solution
  • The Number of Author and Expert Comments
  • The Number of Experts Contributing
  • The Feedback of the Community

Your Input Matters
Because of the way the system is set up, the most important variable in this equation is you. As a member of Experts Exchange, you are able to cast your vote on the quality of the solutions in regard to how complete, accurate, helpful and easy to understand each solution is. When you provide your feedback, each rating is adjusted accordingly. So, if you see a solution that has a poor rating that you think is a good solution, let us know by rating it. As you do, the rating will be adjusted and will become more accurate for other members of our site.

If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support.

Thank you!

8.8

VBscript/Wscript - MS DOS Help - retrieving error code from PSEXEC, equivalent of "runwait"?

Asked by ThinkPaper in Shell Scripting, Microsoft Windows Operating Systems, VB Script

Tags: , , ,

This is yet another question related to previous questions I posted. I have a script that removes symantec from a specified list of computers. Symantec is removed using the PSEXEC tool from Microsoft.
The way the script works is like this:
I have a list of computers in computer.txt. This is stored in an array.
I also have a list of Uninstall keys for Symantec stored in an array. The reason I have multiple uninstall keys is because some client computers have different versions of symantec installed on their computer. To uninstall them, I need to set the UninstallPW key to false. I also need the specific uninstall key to remove it. So for each computer, run the PSEXEC command for each key:

psexec \\" & strComputer & " MsiExec.exe /norestart /q /x " & strSymantecKey & " REMOVE=ALL

This somewhat works. The first problem is it doesn't seem to perform like a "runwait".. where it waits until the uninstall is done before executing the next command. It basically just runs right after the other without waiting for it to be done. I'm afraid this could cause problems during the uninstall.

The second problem is that when this runs, the command prompt opens for a split second and closes. I would like to have one continuous command window open at all times until the script is completely done. Is there a way to do this?

The third problem is this. When the psexec command finishes, it returns an error code in the command line. I would like to keep track of this in a log. But I don't know how to RETRIEVE the error code from the command line back to VBscript. Can anyone help me figure out how to retrieve the error code, and if the error code is 0 (successful) then exit out the for loop and go to next computer?

My main concern right now is retreiving the error and logging. Thanks!

Here is my code:

'Remove Symantec Remotely and Silently
'Results are stored in a log file: symantec.log

'--------------- Create Log File ----------------

'Open up the path to save the information into a text file
Dim Stuff, myFSO, WriteStuff, timeStamp
timeStamp = Time()

Set myFSO = CreateObject("Scripting.FileSystemObject")
Set WriteStuff = myFSO.OpenTextFile("symantec.log", 2, True)

Dim objShell: Set objShell=CreateObject("Wscript.Shell")

Dim startMsg
startMsg = "STARTING SCRIPT, YO!" & vBCrLF & "You do not neet to click OK until it is done." &_
           vbcrlf & "When the script is done, it will say DONE, YO! Check symantec.log for results."

objShell.Popup startMsg, 3
'WScript.Echo startMsg

WriteStuff.WriteLine("Starting Script, yo!" & vbcrlf)

'-------------------- Grab computer names from Computer.txt and store in array ----------------

strComputers = ""

On Error Resume Next

'Initialize global constants and variables.
Const FOR_READING = 1
g_strHostFile = "computer3520.txt"

'Read computer names for install from text file.
Set objFSO = CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists(g_strHostFile) Then
  Set objTextStream = objFSO.OpenTextFile(g_strHostFile, FOR_READING)
Else
  WScript.Echo "ERROR: Input file " & g_strHostFile & " not found."
  WScript.Quit
End If

'Loop through list of computers and perform tasks on each.
Do Until objTextStream.AtEndOfStream
  readingInComputer= objTextStream.ReadLine
'  Wscript.Echo VbCrLf & readingInComputer
 
 strComputers = strComputers + readingInComputer +","
Loop

objTextStream.Close

arrComputers = Split(strComputers , ",")
 

'----------------------------- Symnantec Piece---------------------------------
'Pre condition:  arrComputers must be populated from Computer.txt


'------- Insert all Available Keys Here-------------------
Dim strSymantecKeys
strSymantecKeys="{5a633ed0-e5d7-4d65-ab8d-53ed43510284},{46B63F23-2B4A-4525-A827-688026BE5E40},{BA4B71D1-898E-4306-AE87-8BA7A596F0ED}.{a011a1dc-7f1d-4ea8-bd11-0c5f9718e428},{473af7d0-b864-4699-9974-df570c5b6dce},{a011a1dc-7f1d-4ea8-bd11-0c5f9718e428},{50e125d1-88e5-48ce-80ae-98ec9698e639},{D75D48AF-E2D5-49EF-9571-EE7AFB6565B4}"
'---------------------------------------------------------
Const HKEY_LOCAL_MACHINE = &H80000002

arrSymantecKeys = Split(strSymantecKeys, ",")


For Each strComputer in arrComputers

On Error Resume Next
       '---- If computername is blank then exit loop ---
        If strComputer = "" Then
           exit for
        End If
 
 '----------- Set Uninstall Password & LockUnloadSvcs Registry Key Values-------

 Set objReg = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")

 'objShell.Popup "Error = " & err.number & "!!!", 1

 ' ----If getObject fails, server is offline or doesn't exist -------------
 If err.number <> 0 then
      err.clear

        objShell.Popup "ERROR: "& strComputer & " is offline or access is denied", 1
      'wscript.echo "ERROR: "& strComputer & " is offline or access is denied"
      
      'write to log file
      WriteStuff.WriteLine(timeStamp & "  " & strComputer & " - ERROR! It is offline or doesn't exist.")
      On Error GoTo 0

 '------ Else GO ahead and remove Registry Keys ---------------------
 Else
   On Error GoTo 0

'   strKeyPath = "SOFTWARE\INTEL\LANDesk\VirusProtect6\CurrentVersion\AdministratorOnly\Security"
'   ValueName = "LockUnloadServices"

'   objReg.GetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, ValueName, strValue

'   If strValue<>0 Then
'      objReg.setDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, ValueName, 0
      'WScript.Echo strComputer & ": LockUnloadServices set to: " & strValue
'   End If

'   ValueName = "UseVPUninstallPassword"

'   objReg.GetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, ValueName, strValue

'   If strValue<>0 Then
'     objReg.setDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, ValueName, 0
     'WScript.Echo strComputer & ": UninstallPW set to: " & strValue
'   End If

   '----- Run MSIEXEC to remove Symantec -------------

  For Each strSymantecKey in arrSymantecKeys

     'objShell.run "%comspec% /k psexec \\" & strComputer & " MsiExec.exe /norestart /q /x " & strSymantecKey & " REMOVE=ALL", 8, true
      objShell.run "psexec \\" & strComputer & " MsiExec.exe /norestart /q /x " & strSymantecKey & " REMOVE=ALL", 8, true
     'objShell.Run "%comspec% /k rem "
  Next

  'Print to log file
   WriteStuff.WriteLine(timeStamp & " - " & strComputer & " - Symantec Removed.")

  'objShell.Popup strComputer & " - Symantec Removed", 1
  'WScript.Echo strComputer & " - Symantec Removed"


 End If


SET objReg=Nothing
 
 
Next


'Write to log file and close it
WriteStuff.WriteLine(vbcrlf & "Script is Done, yo!
WriteStuff.Close
SET WriteStuff = NOTHING
SET myFSO = NOTHING
SET objShell = NOTHING

'Let user know the script is done!
WScript.Echo "SCRIPT IS DONE, YO!!!"Start Free Trial
[+][-]04.10.2007 at 06:47PM PDT, ID: 18886941

View this solution now by starting your 7-day free trial. Setting up your free trial is quick, easy, and secure. We will return you to this solution, unlocked, when you're done.

 

About this solution

Zones: Shell Scripting, Microsoft Windows Operating Systems, VB Script
Tags: vbscript, error, psexec, code
Sign Up Now!
Solution Provided By: RobSampson
Participating Experts: 1
Solution Grade: A
 
 
[+][-]04.16.2007 at 05:51AM PDT, ID: 18917230

Often, when Experts are collaborating with members who have asked questions, they will request additional information about the problem. Askers respond with an author comment like this one.

Start your 7-day free trial to view this Author Comment or ask the Experts your question.

 
 
Loading Advertisement...
20080716-EE-VQP-32