Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Netlogon sript to distinguish SP4

2 views
Skip to first unread message

Joe Q

unread,
Sep 10, 2003, 1:29:25 PM9/10/03
to
I created a script to install SP4 and the hotfix for
MSBlaster a few weeks ago to get all of our machines up to
snuff. So it only loaded on machines without the Hotfix (I
assumed it didn't have SP4 without the fix) I used this:

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

Torgeir Bakken (MVP)

unread,
Sep 10, 2003, 1:54:05 PM9/10/03
to
Joe Q wrote:

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


Steve

unread,
Sep 10, 2003, 2:20:41 PM9/10/03
to
You could also use Kixtart see http://kixtart.org
Kixtart has a macro that can tell you what os, build,
service pack and other things.

Just another option

Steve

>.
>

Steve

unread,
Sep 10, 2003, 2:25:49 PM9/10/03
to
Here are some examples you could use with kixtart to do
what you are asking about sp4. This came from I script I
used before

$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

>.
>

0 new messages