Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

210 lines
5.7 KiB

'''''''''''''''''''''''''''''''''''''''''''''
'
' IWAM account synchronization utility
'
'''''''''''''''''''''''''''''''''''''''''''''
' Description:
' ------------
' This admin script allows you to update the launching identity of
' all IIS COM+ application packages that run out of process.
'
' There are certain operations that may cause the IWAM account, which
' is the identity under which out of process IIS applications run, to
' become out of sync between the COM+ data store and IIS or the SAM.
' On IIS startup the account information stored in the IIS Metabase
' is synchronized with the local SAM, but the COM+ applications will
' not automatically be updated. The result of this is that requests
' to out of process applications will fail.
'
' When this happens, the following events are written to the system
' event log:
'
' Event ID: 10004 Source: DCOM
' DCOM got error "Logon failure: unknown user name or bad password. "
' and was unable to logon .\IWAM_MYSERVER in order to run the server:
' {1FD7A201-0823-479C-9A4B-2C6128585168}
'
' Event ID: 36 Source: W3SVC
' The server failed to load application '/LM/W3SVC/1/Root/op'.
' The error was 'The server process could not be started because
' the configured identity is incorrect. Check the username and password.
'
' Running this utility will update the COM+ applications with the
' correct identity.
'
' To Run:
' -------
' This is the format for this script:
'
' cscript synciwam.vbs [-v|-h]
' -v verbose: print a trace of the scripts activity
' -h help: print script usage
'
' NOTE: If you want to execute this script directly from Windows, use
' 'wscript' instead of 'cscript'.
'
'''''''''''''''''''''''''''''''''''''''''''''
' Initialize error checking
On Error Resume Next
Const APP_ISOLATED = 1
Const APP_OOP_POOL_ID = "{3D14228D-FBE1-11d0-995D-00C04FD919C1}"
Const IIS_ANY_PROPERTY = 0
Dim WebServiceObj, WamUserName, WamUserPass
Dim ComCatalogObj, ComAppCollectionObj, ComApplication
Dim AppIdArray, AppIdArraySize, AppIdArrayElements
Dim IISAppPathArray, IISAppObj, IISAppPath
Dim TraceEnabled
' Get command line parameters
TraceEnabled = False
if Wscript.Arguments.Count > 0 then
select case WScript.Arguments(0)
case "-h", "-?", "/?":
PrintUsage
case "-v", "/v":
TraceEnabled = True
case else
PrintUsage
end select
end if
' Get a reference to the web service object
set WebServiceObj = GetObject("IIS://LocalHost/w3svc")
QuitOnError()
' Save the wam user name and password
WamUserName = WebServiceObj.WAMUserName
WamUserPass = WebServiceObj.WAMUserPass
QuitOnError()
' Assume that a blank password or user is an error
if WamUserName = "" or WamUserPass = "" then
WScript.Echo "Error: Empty user name or password."
WScript.Quit(1)
end if
' The com+ packages that we want to set are those that run in external
' processes. These include the process pool application and any isolated
' applications defined for this server.
IISAppPathArray = WebServiceObj.GetDataPaths( "AppIsolated", IIS_ANY_PROPERTY )
QuitOnError()
AppIdArraySize = UBound(IISAppPathArray) + 1
Redim AppIdArray( AppIdArraySize )
' Set the id for the pooled application
AppIdArrayElements = 0
AppIdArray(AppIdArrayElements) = APP_OOP_POOL_ID
AppIdArrayElements = AppIdArrayElements + 1
' Get the ids for all isolated applications
Trace "IIS Applications Defined: "
Trace "Name, AppIsolated, Package ID"
for each IISAppPath in IISAppPathArray
set IISAppObj = GetObject( IISAppPath )
Trace IISAppObj.Name & ", " & CStr(IISAppObj.AppIsolated) & ", " & CStr(IISAppObj.AppPackageID)
if APP_ISOLATED = IISAppObj.AppIsolated And IISAppObj.AppPackageID <> "" then
AppIdArray(AppIdArrayElements) = IISAppObj.AppPackageID
AppIdArrayElements = AppIdArrayElements + 1
end if
set IISAppObj = Nothing
next
Trace ""
' Readjust the size of the id array. The size is initially set
' larger than it needs to be. So we will reduce it so com+ does
' not have to do more work than necessary
Redim Preserve AppIdArray(AppIdArrayElements)
' Dump the array of application ids
if TraceEnabled then
WScript.Echo "Out of process applications defined: "
WScript.Echo "Count: " & CStr(AppIdArrayElements)
for i = 0 to AppIdArrayElements - 1
WScript.Echo AppIdArray(i)
next
WScript.Echo ""
end if
' Init com admin objects
set ComCatalogObj = CreateObject( "COMAdmin.COMAdminCatalog" )
QuitOnError()
set ComAppCollectionObj = ComCatalogObj.GetCollection( "Applications" )
QuitOnError()
ComAppCollectionObj.PopulateByKey( AppIdArray )
QuitOnError()
' Update the com applications
Trace "Updating Applications: "
for each ComApplication in ComAppCollectionObj
Trace "Name: " & ComApplication.Name & " Key: " & CStr(ComApplication.Key)
ReportErrorAndContinue()
ComApplication.Value("Identity") = WamUserName
ReportErrorAndContinue()
ComApplication.Value("Password") = WamUserPass
ReportErrorAndContinue()
next
ComAppCollectionObj.SaveChanges
QuitOnError()
'''''''''''''''''''''''''''''''''''''''''''''
' Helper functions
'
sub QuitOnError()
if err <> 0 then
WScript.Echo "Error: " & Hex(err) & ": " & err.description
Wscript.Quit(1)
end if
end sub
sub ReportErrorAndContinue()
if err <> 0 then
WScript.Echo "Error: " & Hex(err) & ": " & err.description
err.Clear
end if
end sub
sub Trace( str )
if TraceEnabled then
WScript.Echo CStr(str)
end if
end sub
sub PrintUsage()
Wscript.Echo "Usage: cscript synciwam.vbs [-v|-h]"
Wscript.Echo vbTab & "-v verbose: trace execution of the script"
Wscript.Echo vbTab & "-h help: print this message"
WScript.Quit(0)
end sub