REM Check for existing service pack number
if exist REM Check for existing service pack number
if exist %SYSTEMROOT%\$NtUninstallKB823980$ goto :EXIT
The problem is, I "slipstreamed" SP4 and the hotfix into
the installs for new machines, so the
%SYSTEMROOT%\$NtUninstallKB823980$ is no longer...
Is there a file that will uniquely discern SP4 from prior
releases so I can use the IF EXIST statement?
Any other suggestions? Is there a WMI solution?
Thanks in advance!
Joe Q
Hi
The free command line tool osver.exe in Admtool3.zip from Bill Stewart's page
enables you to check SP level from a batch file:
http://mywebpages.comcast.net/stewartb/
A VBScript that gives you OS service pack version:
http://groups.google.com/groups?selm=3EB70B7E.12C8CE54%40hydro.com
Here is a VBScript that checks on the version level on the rpcrt4.dll file on
WinXP and Win2k to see if the RPC patch is installed:
Set oShell = CreateObject("WScript.Shell")
Set oFSO = CreateObject("Scripting.FileSystemObject")
sOSVer = GetOsVersionNumber()
sSPVer = GetSPNumberSW()
If sOSVer < 4 Then
MsgBox "Win9X/ME does not need the RPC patch!",, "RPC flaw check"
ElseIf sOSVer = 5 Then
' Win2k
If sSPVer < 2 Then
MsgBox "Win2k SP or better needed to install the RPC patch!", _
vbCritical, "RPC flaw check"
WScript.Quit
Else
sNeededRpcVer = "5.0.2195.6753"
End If
ElseIf sOSVer = 5.1 Then
' WinXP
If sSPVer > 0 Then
sNeededRpcVer = "5.1.2600.1230"
Else
sNeededRpcVer = "5.1.2600.109"
End If
Else
MsgBox "This script only will only check Win2k and WinXP computers",, _
"RPC flaw check"
End If
Set sWinSysDir = oFSO.GetSpecialFolder(1)
sResult = CompareFileVersions(sNeededRpcVer, sWinSysDir & "\rpcrt4.dll")
If sResult = "FirstFileNewest" Then
MsgBox "You do *NOT* have the RPC update installed. Please install it", _
vbOkOnly, "Important"
Else
MsgBox "You already have the RPC update installed.", vbOkOnly, "Finished"
End If
Function GetOsVersionNumber()
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Determines OS by reading reg val & comparing to known values
' OS version number returned as number of type double:
' Windows 2k: 5
' Windows XP: 5.1
' Windows Server 2003: 5.2
' Windows x: >5.2
' Note: Decimal point returned is based on the Locale setting
' of the computer, so it might be returned as 5,1 as well.
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim sOStype, sOSversion
On Error Resume Next
sOStype = oShell.RegRead(_
"HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions\ProductType")
If Err.Number<>0 Then
' Hex(Err.Number)="80070002"
' - Could not find this key, OS must be Win9x
Err.Clear
sOStype = oShell.RegRead(_
"HKLM\SOFTWARE\Microsoft\Windows" & _
"\CurrentVersion\VersionNumber")
Select Case sOStype
Case "4.00.950"
sOSversion = 1 ' Windows 95A
Case "4.00.1111"
Dim sSubVersion
sSubVersion = oShell.RegRead(_
"HKLM\SOFTWARE\Microsoft\Windows" & _
"\CurrentVersion\SubVersionNumber")
Select Case sSubVersion
Case " B"
sOSversion = 1 ' Windows 95B
Case " C"
sOSversion = 1 ' Windows 95C
Case Else
sOSversion = 1 ' Unknown Windows 95
End Select
Case "4.03.1214"
sOSversion = 1 ' Windows 95B
Case "4.10.1998"
sOSversion = 2 ' Windows 98
Case "4.10.2222"
sOSversion = 2 ' Windows 98SE
Case "4.90.3000"
sOSversion = 3 ' Windows Me
Case Else
sOSversion = 1 ' Unknown W9x/Me
End Select
Else ' OS is NT based
sOSversion = oShell.RegRead(_
"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion")
If Err.Number<>0 Then
GetOsVersion = "Unknown NTx"
' Could not determine NT version
Exit Function ' >>>
End If
End If
' Setting Locale to "en-us" to be indifferent to country settings.
' CDbl might err else
SetLocale "en-us"
GetOsVersionNumber = CDbl(sOSversion)
End Function
Function GetSPNumberSW()
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Determines Service Pack number by reading reg val CSDVersion in
' HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CSDVersion
'
' CSDVersion in System\CCS is updated AFTER a reboot when
' installing a SP
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim sOStype, sOSversion, iSPNumber, aSPNumber
On Error Resume Next
sOStype = oShell.RegRead(_
"HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions\ProductType")
If Err.Number<>0 Then
' Hex(Err.Number)="80070002"
' - Could not find this key, OS must be Win9x
Err.Clear
GetSPNumberSW = "W9x"
Exit Function ' >>>
End If
iSPNumber = oShell.RegRead(_
"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CSDVersion")
If Err.Number<>0 Then
GetSPNumberSW = 0
' Could not determine Service Pack
Exit Function ' >>>
End If
' CSDVersion is e.g. "Service Pack 2"
aSPNumber = Split(iSPNumber)
GetSPNumberSW = Cint(aSPNumber(2))
End Function
Function CompareFileVersions(sFileInfo1, sFileInfo2)
Dim sFileVer1, sFileVer2, aFileVer1, aFileVer2, iCount, iDateDiff
If sFileInfo1 = "" Or sFileInfo2 = "" Then
MsgBox _
"CompareFileVersions error: Invalid argument, empty argument given!", _
vbExclamation, "Machine Logon script"
Err.Raise 5 'Invalid procedure call or argument
End If
If oFSO.FileExists(sFileInfo1) Then
sFileVer1 = oFSO.GetFileVersion(sFileInfo1)
Elseif UBound(Split(sFileInfo1, ".")) = 3 Then
sFileVer1 = sFileInfo1
Else
MsgBox "CompareFileVersions error: 1. argument is not an existing file " _
& "or correct file version format: " & sFileInfo1, _
vbExclamation, "Machine Logon script"
Err.Raise 5 'Invalid procedure call or argument
End If
If oFSO.FileExists(sFileInfo2) Then
sFileVer2 = oFSO.GetFileVersion(sFileInfo2)
Elseif UBound(Split(sFileInfo2, ".")) = 3 Then
sFileVer2 = sFileInfo2
Else
MsgBox "CompareFileVersions error: 2. argument is not an existing file " &
_
"or correct file version format: " & sFileInfo2, _
vbExclamation, "Machine Logon script"
Err.Raise 5 'Invalid procedure call or argument
End If
If sFileVer1 <> "" And sFileVer2 <> "" Then
If sFileVer1 = sFileVer2 Then
CompareFileVersions = "SameVersion"
Else
aFileVer1 = Split(sFileVer1, ".")
aFileVer2 = Split(sFileVer2, ".")
For iCount = 0 To 3
If CInt(aFileVer1(iCount)) > CInt(aFileVer2(iCount)) Then
CompareFileVersions = "FirstFileNewest"
Exit For
ElseIf CInt(aFileVer1(iCount)) < CInt(aFileVer2(iCount)) Then
CompareFileVersions = "SecondFileNewest"
Exit For
Else
CompareFileVersions = "UnknownStatus"
End If
Next
End If
Elseif sFileVer1 <> "" And sFileVer2 = "" Then
CompareFileVersions = "FirstFileNewest"
Elseif sFileVer1 = "" And sFileVer2 <> "" Then
CompareFileVersions = "SecondFileNewest"
Else
iDateDiff = DateDiff("s", oFSO.GetFile(sFileInfo1).DateLastModified, _
oFSO.GetFile(sFileInfo2).DateLastModified)
If iDateDiff < 0 Then
CompareFileVersions = "FirstFileNewest"
ElseIf iDateDiff > 0 Then
CompareFileVersions = "SecondFileNewest"
Else
CompareFileVersions = "SameVersion"
End If
End If
End Function
--
torgeir
Microsoft MVP Scripting and WMI, Porsgrunn Norway
Administration scripting examples and an ONLINE version of the 1328 page
Scripting Guide: http://www.microsoft.com/technet/scriptcenter
Just another option
Steve
>.
>
$Dummy = WRITELINE (10, "Operating System Check Running."
+ CHR(13) + CHR(10))
SELECT
CASE @PRODUCTTYPE = "Windows 95"
$Server = "No"
$OS = "W95"
CASE @PRODUCTTYPE = "Windows 98"
$Server = "No"
$OS = "W98"
CASE @PRODUCTTYPE = "Windows Me"
$Server = "No"
$OS = "WMe"
CASE @PRODUCTTYPE = "Windows NT Workstation"
$Server = "No"
$OS = "NT4"
CASE @PRODUCTTYPE = "Windows NT Server"
$Server = "Yes"
$OS = "NT4"
CASE @PRODUCTTYPE = "Windows NT Domain Controller"
$Server = "Yes"
$OS = "NT4"
CASE @PRODUCTTYPE = "Windows 2000 Professional"
$Server = "No"
$OS = "W2K"
CASE @PRODUCTTYPE = "Windows 2000 Server"
$Server = "Yes"
$OS = "W2K"
CASE @PRODUCTTYPE = "Windows 2000 Domain
Controller"
$Server = "Yes"
$OS = "W2K"
CASE @PRODUCTTYPE = "Windows XP Home Edition"
$Server = "No"
$OS = "WXP"
CASE @PRODUCTTYPE = "Windows XP Professional"
$Server = "No"
$OS = "WXP"
CASE @PRODUCTTYPE = "Windows XP Server"
$Server = "Yes"
$OS = "WXP"
CASE @PRODUCTTYPE = "Windows XP Domain Controller"
$Server = "Yes"
$OS = "WXP"
CASE 1 @PRODUCTTYPE = "???" ; - undetermined -
ENDSELECT
$Dummy = WRITELINE(10, "Service Pack Check and
Installation" + CHR(13) + CHR(10))
If $server="Yes"
$Dummy = WRITELINE(10, "This is a Server Class
Machine Service Pack Check skipped" + CHR(13) + CHR(10))
GOTO IE6
ELSE
ENDIF
If $OS="W2K" and @CSD="Service Pack 2" or @CSD="Service
Pack 3"
$Dummy = WRITELINE(10, "@WKSTA @PRODUCTTYPE
Service Pack level is up to date" + CHR(13) + CHR(10))
GOTO IE6
>.
>