When deploying files via Group Policy Preferences (GPP) to Program Files
directories, system architects frequently need to distinguish between 32-bit and 64-bit Windows installations. The challenge stems from the different directory structures:
64-bit OS: C:\Program Files and C:\Program Files (x86) 32-bit OS: C:\Program Files only
1. WMI Filtering
The most precise method uses WMI queries in the Targeting Editor:
SELECT * FROM Win32_Processor WHERE AddressWidth = 32
For 64-bit systems:
SELECT * FROM Win32_Processor WHERE AddressWidth = 64
2. Environment Variable Check
A lighter alternative checks for the presence of ProgramFiles(x86)
:
Targeting condition: Environment Variable Variable: ProgramFiles(x86) Condition: Exists
3. Registry-Based Detection
Check the processor architecture in registry:
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0 Look for "Identifier" value containing "x86" or "x64"
Example registry target condition:
Registry Item Targeting: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment Value Name: PROCESSOR_ARCHITECTURE Value: x86 (for 32-bit) or AMD64 (for 64-bit)
WMI Filter Creation Steps
- Open Group Policy Management Console
- Right-click WMI Filters → New
- Enter query:
SELECT * FROM Win32_OperatingSystem WHERE OSArchitecture = "32-bit"
- Apply filter to your GPO
Sample Item-Level Targeting
For files that should only deploy to 64-bit systems:
<Item xsi:type="File" action="Create" src="\\server\share\file.dll" dest="%ProgramFiles%\AppFolder\file.dll"> <Targeting> <OperatingSystem Architecture="64-bit"/> </Targeting> </Item>
While WMI queries are most accurate, they add ~100-300ms processing time per client. Environment variable checks are nearly instantaneous but less comprehensive. Registry checks offer a middle ground.
For environments with both architectures, create two separate file deployment items with opposing targeting conditions. This example shows deploying different DLL versions:
<!-- 32-bit version --> <Item xsi:type="File" action="Create" src="\\server\share\x86\library.dll" dest="%ProgramFiles%\App\library.dll"> <Targeting> <OperatingSystem Architecture="32-bit"/> </Targeting> </Item> <!-- 64-bit version --> <Item xsi:type="File" action="Create" src="\\server\share\x64\library.dll" dest="%ProgramFiles%\App\library.dll"> <Targeting> <OperatingSystem Architecture="64-bit"/> </Targeting> </Item>
When deploying files to Program Files folders through Group Policy Preferences (GPP), distinguishing between 32-bit and 64-bit Windows systems becomes crucial. The typical path resolution differences (Program Files
vs Program Files (x86)
) require careful targeting to ensure proper file placement.
Here are the most efficient approaches I've tested in production environments:
1. WMI Filter Method
The most precise technique uses WMI queries in the GPP targeting editor:
SELECT * FROM Win32_Processor WHERE AddressWidth = 64
SELECT * FROM Win32_OperatingSystem WHERE OSArchitecture = "64-bit"
2. Environment Variable Check
For simpler scenarios, test for ProgramFiles(x86)
existence:
Targeting Condition: Environment Variable
Variable: ProgramFiles(x86)
Condition: Exists
3. Registry-Based Detection
Check the processor architecture flag in registry:
Targeting Condition: Registry Setting
Hive: HKEY_LOCAL_MACHINE
Key: SYSTEM\CurrentControlSet\Control\Session Manager\Environment
Value: PROCESSOR_ARCHITECTURE
Type: REG_SZ
Data: AMD64 (for 64-bit) or x86 (for 32-bit)
Here's a complete GPP item example for 64-bit systems:
<Item clsid="{915F2B9C-81D3-4C08-915D-79B6B9A1CAB9}">
<Properties action="C" newFiles="%ProgramFiles%\MyApp\" />
<Filters>
<FilterGroup boolean="AND" not="0">
<Filter boolean="AND" not="0" type="WQL" name="64bit OS">
<QueryList>
<Query>
<![CDATA[SELECT * FROM Win32_OperatingSystem WHERE OSArchitecture = "64-bit"]]>
</Query>
</QueryList>
</Filter>
</FilterGroup>
</Filters>
</Item>
While WMI provides the most accurate results, it does incur slight processing overhead. For large-scale deployments with thousands of clients, the environment variable method offers better performance with nearly equivalent reliability.
In critical production environments, I recommend combining methods:
Boolean: AND
- WMI: OSArchitecture = "64-bit"
- Environment: ProgramFiles(x86) Exists