Setting ConfigMgr 2007 App-V Program OS Restrictions - Sample Script
Below is vbscript that sets designated OS restrictions for all App-V packages within a ConfigMgr 2007 folder (since this cannot be done in the GUI). It's useful when using ConfigMgr user-based targetting to ensure App-V packages are only downloaded to the designated operating system(s).
ConfigMgr 2012 allows setting this in the GUI.
Note: This script should be saved as a .vbs file and run with administrative permissions on the ConfigMgr server. Before running, the folderID of the planned targetting folder needs to be determined (which can be done by a referenced script). Also note, the script below suppresses the countdown dialog.
Dim StrSMSServer, strPackageID, strProgramName, strFolderNodeID
Dim objLocator, objSCCM, objProgram, objPrograms, Providers, Provider
Dim tempSupportedPlatform, tempSupportedPlatform2, tempSupportedPlatformsArray
Dim colObjectContainerItems
Dim item
strSMSServer = "."
strFolderNodeID = "<folderID - fromother.vbs>"
strProgramName = "[Virtual application]"
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSCCM = objLocator.ConnectServer(strSMSServer, "root\sms")
Set Providers = objSCCM.ExecQuery("SELECT * From SMS_ProviderLocation WHERE ProviderForLocalSite = true")
For Each Provider in Providers
If Provider.ProviderForLocalSite = True Then
Set objSCCM = objLocator.ConnectServer(Provider.Machine, "root\sms\site_" & Provider.SiteCode)
End If
Next
Set colObjectContainerItems=objSCCM.Execquery("select * from sms_objectcontaineritem where objecttype=2 and ContainerNodeId='" & strFolderNodeID & "'")
For each item in colObjectContainerItems
WScript.Echo item.InstanceKey
Set objPrograms = objSCCM.ExecQuery("Select * from SMS_Program where PackageID='" & item.InstanceKey & "' and ProgramName='" & strProgramName & "'")
For each objProgram in objPrograms
If (objProgram.ProgramFlags and 1024) = 0 then
WScript.Echo "Suppress Countdown Flag Not Present - Setting Flag"
WScript.Echo "Adding 0x00000400 (COUNTDOWN. The countdown dialog is not displayed)"
objProgram.ProgramFlags = objProgram.ProgramFlags + 1024
Else
WScript.Echo "Flag Already Set"
End If
If (objProgram.ProgramFlags and 134217728) = 134217728 then
WScript.Echo "Override platform support enabled - Removing Flag"
WScript.Echo "Removing 0x08000000 (Override check for platform support) to allow OS restriction to be set"
objProgram.ProgramFlags = objProgram.ProgramFlags - 134217728
Else
WScript.Echo "Flag Already Set"
End If
WScript.Echo "Sets OS Values"
Set tempSupportedPlatform = objSCCM.Get("SMS_OS_Details").SpawnInstance_
' Populate tempSupportedPlatform values.
tempSupportedPlatform.MaxVersion = "6.10.9999.9999"
tempSupportedPlatform.MinVersion = "6.10.0000.0"
tempSupportedPlatform.Name = "Win NT"
tempSupportedPlatform.Platform = "x64"
' Use the existing array to set datatype
tempSupportedPlatformsArray = objProgram.SupportedOperatingSystems
' Add the new supported platform values (object) to the temporary array.
ReDim tempSupportedPlatformsArray (0)
Set tempSupportedPlatformsArray(0) = tempSupportedPlatform
' Replace the SupportedOperatingSystems object array with the new array.
objProgram.SupportedOperatingSystems = tempSupportedPlatformsArray
WScript.Echo "Set flags and OS values"
objProgram.Put_
Next
Next
References:
Script to find folder ID: https://blog-en.netvnext.com/2011/03/list-of-packages-in-sccm-folder.html#!/2011/03/list-of-packages-in-sccm-folder.html
List of OS values (note: I386 is case-sensitive): https://social.technet.microsoft.com/Forums/en-US/configmgrswdist/thread/43e5e010-d14d-4907-be79-c63bea79d7ae/
Program Flags Reference: https://msdn.microsoft.com/en-us/library/cc143360.aspx
MSDN setting OS restriction reference: https://msdn.microsoft.com/en-us/library/cc144942.aspx
Set OS restrictions: https://techpppp.blogspot.com/2010/09/sccm-converting-programs-to-windows-7.html
Note: No warranty or support is implied with the use of the scripts discussed in this article.