Remember delmif.exe in SMS 1.2? It was a nice utility used to delete machines throughout your entire hierarchy. In SMS 2003 resource deletions do not flow from child sites up the hierarchy.
In SMS 2003 SP2 some improvements have been made to deal with this. Decommissioned DDRs now get created and sent to the parent site when a deletion occurs. This is not enabled by default.To enable this feature, set the following registry value:
HKLM\Software\Microsoft\SMS\Components......\SMS_Discovery_Data_Manager:DecommissionNotificationto a value of 1.
You typically only want to use this feature on sites that require it (lower tier sites, only one per hierarchy branch recommended). When the parent site processes the decommissioned DDR the Decommissioned property in SMS_R_System class (System_DISC table) gets set from 0 to 1. You can then query and base collections on this property.
So what if this feature doesn't meet your needs or you don't have SP2? Well, you can manually delete the resources from each site in your hierarchy or run a script like the one attached against your central site and have it delete the resources in your hierarchy.
-Russ
'Script Name: DelClient.vbs 'Script Author: Rslaten 'Script Purpose: Delete a client throughout hierarchy 'Script Creation Date: 04/01/2005 'Script Version: 1.1 'Revision History 'Ver Date Person Description '----------------------------------------------------------------------------------------- '1.0 04/01/2005 rslaten Created Script '1.1 02/14/2006 rslaten Added additional error checking to script 'Other Information 'Set globals Dim sCenSiteServer, sDelClient, bEverywhere, sSMSCenNameSpace, SMSSites() 'Call to start program Main Sub Main GetCommandLineArguments sSMSCenNameSpace = GetSMSNameSpace(sCenSiteServer) If bEverywhere Then GetSiteList DelClientLoop Else DelSingleClient End If End Sub 'Deletes single client Sub DelSingleClient On Error Resume Next Dim oLocator, oServices, refItem, colClient Set oLocator = CreateObject("WbemScripting.SWbemLocator") WScript.Echo "Connecting to " &sCenSiteServer Set oServices = oLocator.ConnectServer(sCenSiteServer, sSMSCenNameSpace,,,,,128) If Err.number <> 0 Then WScript.Echo "Unable to connect to " &sCenSiteServer WScript.Echo Err.number & " - " &Err.Description Else Set colClient = oServices.ExecQuery("select * from SMS_R_System where NetbiosName =" _ & " '" &sDelClient& "'") If colClient is Nothing or Err.Number <> 0 Then WScript.Echo sDelClient& " doesn't exist at site " & sCenSiteServer Else For each refItem in colClient refItem.Delete_() If Err.number <> 0 Then WScript.Echo "Failed to delete " &sDelClient& " on site " & sCenSiteServer WScript.Echo Err.number & " - " & Err.Description Else WScript.Echo "Successfully deleted " &sDelClient& " on site " & sCenSiteServer End If Next End If End If Set refItem = Nothing Set colClient = Nothing Set oServices = Nothing Set oLocator = Nothing End Sub 'Delete clients Sub DelClientLoop() On Error Resume Next Dim oLocator, oServices, Namespace, refItem, colClient Set oLocator = CreateObject("WbemScripting.SWbemLocator") For i = 0 to UBound(SMSSites) WScript.Echo "Connecting to " &SMSSites(i) Namespace = GetSMSNamespace(SMSSites(i)) Set oServices = oLocator.ConnectServer(SMSSites(i), NameSpace,,,,,128) If Err.number <> 0 Then WScript.Echo "Unable to connect to " &SMSSites(i) WScript.Echo Err.number & " - " &Err.Description Else Set colClient = oServices.ExecQuery("select * from SMS_R_System where NetbiosName =" _ &" '" &sDelClient& "'") If colClient is Nothing or Err.Number <> 0 Then WScript.Echo sDelClient& " doesn't exist at site " & SMSSites(i) Else For each refItem in colClient refItem.Delete_() If Err.number <> 0 Then WScript.Echo "Failed to delete " &sDelClient& " on site " & SMSSites(i) WScript.Echo Err.number & " - " & Err.Description Else WScript.Echo "Successfully deleted " &sDelClient& " on site " & SMSSites(i) End If Next End If End If Set refItem = Nothing Set colClient = Nothing Set oServices = Nothing Next Set oLocator = Nothing End Sub 'Gets list of SMS Sites in the hierarchy Sub GetSiteList() On Error Resume Next WScript.Echo "Getting list of SMS Primary Sites from " &sCenSiteServer Dim oLocator, oServices, colSites, refItem, i Set oLocator = CreateObject("WbemScripting.SWbemLocator") Set oServices = oLocator.ConnectServer(sCenSiteServer, sSMSCenNameSpace,,,,,128) If Err.number <> 0 Then WScript.Echo "Error connecting to " &sSMSCenNameSpace& " on " &sCenSiteServer& ": " _ &Err.Number Set oLocator = Nothing Set oServices = Nothing WScript.Quit End If Set colSites = oServices.ExecQuery("select * from SMS_Site") For Each refItem in colSites If refItem.Type = "2" Then ReDim Preserve SMSSites(i) SMSSites(i) = refItem.ServerName i = i + 1 End If Next Set colSites = Nothing Set oLocator = Nothing Set oServices = Nothing End Sub 'Gets SMS namespace Function GetSMSNameSpace(SiteServer) On Error Resume Next Dim colNameSpaceQuery, refitem, refWMI Set refWMI = GetObject("winMgmts:\\" &SiteServer&"\root\sms") If Err.number <> 0 Then WScript.Echo "Error connecting to SMS namespace on " &SiteServer WScript.Quit End If Set colNameSpaceQuery = refWMI.ExecQuery("select * from SMS_ProviderLocation") For Each refitem in colNameSpaceQuery GetSMSNameSpace = refitem.NamespacePath Next Set colNameSpaceQuery = Nothing Set refitem = Nothing Set refWMI = Nothing End Function 'Gets Command line args Sub GetCommandLineArguments On Error Resume Next Dim iParameterCount iParameterCount = WScript.Arguments.Count If iParameterCount < 2 Then ShowHelp Bailout End If If iParameterCount = 2 Then bEverywhere = FALSE Else If Ucase(WScript.Arguments(2)) = "EVERYWHERE" Then bEverywhere = TRUE End If End If sCenSiteServer = WScript.Arguments(0) sDelClient = WScript.Arguments(1) End Sub 'Routine for quiting script Sub Bailout WScript.Quit End Sub 'Displays syntax Sub ShowHelp WScript.Echo "" WScript.Echo "DelClient v1.1" WScript.Echo "Usage: cscript.exe DelClient.vbs <CenSiteServerName> <NameOfClient> EVERYWHERE" WScript.Echo "Note, the EVERYWHERE parameter is optional." WScript.Echo "If EVERYWHERE is used then it will delete the client from each lower tier site." WScript.Echo "If EVERYWHERE is not used then this script will only delete from that server." WScript.Echo "Example: cscript.exe DelClient.vbs myCentralSiteServer myDeletedClient" WScript.Echo "" End Sub