The KACE Agent is 32-bit only; this can cause the following issues:
* 32-bit processes can't access 64-bit software registry entries (64-bit programs have access to SOFTWARE\WOW6432Node; there is no equivalent for 32-bit programs)
* Some command line arguments in Windows are 64-bit only
* Some PowerShell commands in Windows are 64-bit only
After much trial and error, and research, I have created 1-liners for both Command Prompt Batch (BAT/CMD) files and PowerShell files that will relaunch your scripts in the 64-bit version of CMD/PS.
Simply add these lines to the top of your Batch/PS script, and your batch file will relaunch in the 64-bit process.
For batch files, "@echo off" is not required, but will clean up the script's output to the screen and the KACE log files.
BATCH FILE
@echo off
IF /I "%__APPDIR__%" == "%WinDir%\SysWOW64\" (%windir%\sysnative\cmd.exe /C "%~f0" && exit /B)
POWERSHELL FILE
if ($pshome -like "*syswow64*") {& (join-path ($pshome -replace "syswow64", "sysnative")\powershell.exe) -file $myinvocation.mycommand.Definition @args; exit}
BATCH FILE EXPLANATION
IF "%__APPDIR__%" == "%WinDir%\SysWOW64\" ( - %__APPDIR__% is an undocumented environment variable. For CMD, this points to "%WinDir%\SysWOW64\" if a 32-bit CMD is running on 64-bit windows; If a 32-bit CMD is running on 32-bit windows, or 64-bit CMD is running on 64-bit windows, %__APPDIR__% will point to %WinDir%\System32\; the "/I" switch for FOR is to enable case insensitive mode
%windir%\sysnative\cmd.exe /C "%~f0" - This launches cmd.exe from the SysNative folder, which is a folder that appears only to 32-bit programs running on 64-bit Windows; this folder is an alias to %WinDir%\System32. Although others have said that simply running the 64-bit CMD from SysNative is enough to get their scripts to work, that didn't work for me. /C launches CMD and tells it to close after executing the script; %~f0 is for the full path to the script, with the script name.
&& exit /B) - After the script is finished running as 64-bit, we need to Exit to get out of the 64-bit CMD and back to the 32-bit CMD. The /B (when used inside a script) tells CMD to exit only the script (or subroutine) but not CMD. After the 64-bit CMD is finished running, this command will terminate the batch file. If we don't have this in here, then after the 64-bit CMD closes, the rest of the script (that you wanted to run in the 64-bit CMD) will run a second time under the 32-bit CMD.
POWERSHELL FILE EXPLANATION
if ($pshome -like "*syswow64*") { - $pshome contains the path to the folder the PowerShell executable is located in; if this folder path has "syswow64" in it, you're running a 32-bit PowerShell on 64-bit Windows.
& (join-path ($pshome -replace "syswow64", "sysnative")\powershell.exe) -file $myinvocation.mycommand.Definition @args; - "&" launches a program; then it launches PowerShell from the 64-bit folder; $myinvocation.mycommand.Definition is the full path to the script, with the script name; @args is for any command line arguments passed to the script.
exit} - Just like with Batch files, after the 64-bit PowerShell process exits, we need to exit the script, to avoid running the rest of the script a second time.
Comments