Когда Powershell работает как 32-битный процесс, я не знаю механизма, позволяющего «переключить его» в 64-битный режим. Весь смысл поддержки виртуализации в 64-битных системах состоит в том, чтобы заставить 32-битные процессы поверить, что они живут в 32-битной ОС ...
Тем не менее, это говорит о том, что я использовал следующую технику в прошлом, и она мне очень понравилась (следующий код был протестирован на Vista SP1 x64 с Powershell v1). Этот метод основан на том факте, что исполняемые файлы .NET "Any CPU" будут работать как 64-битный процесс даже при вызове из 32-битного процесса. Шаги, которые мы будем выполнять:
- Скомпилируйте короткую программу на C #, которая запустит powershell (то есть очень простую реализацию "вилки" :-))
- Запустите скомпилированную программу C #
- Скомпилированная программа на C # запустит Powershell, но поскольку это «Любой процессор», он будет работать как 64-битный процесс, поэтому он запустит 64-битный Powershell (обратите внимание, что, поскольку это всего лишь доказательство концепции, я ожидаю, что PowerShell будет в твой путь')
- Новый 64-битный Powershell будет запускать командлет по нашему выбору.
Это снимок экрана вышеупомянутого в действии (обратите внимание на разрядность процессов): http://img3.imageshack.us/img3/3248/powershellfork.png
Следующая программа ожидает, что все перечисленные файлы будут находиться в одном каталоге. Я рекомендую создать тестовый каталог, например C: \ Temp \ PowershellTest, и хранить там все файлы).
Точкой входа в программу будет простая команда:
# file "test.ps1"
$basePath = Split-Path -resolve $myInvocation.MyCommand.Path
$exe = Join-Path $basePath test.exe
&"$env:SystemRoot\Microsoft.NET\Framework\v3.5\csc.exe" /nologo /target:exe /out:$exe (Join-Path $basePath test.cs)
&$exe (Join-Path $basePath visibility.ps1)
Он запускает csc (32-битный, но это не имеет значения :-)), а затем запускает результат компилятора csc, передавая один аргумент (полный путь к) visibility.ps1 (это командлет, который мы хотим запустить в 64-битной Powershell).
Код C # тоже очень прост:
// file "test.cs"
using System.Diagnostics;
static class Program {
static int Main(string[] args) {
ProcessStartInfo i = new ProcessStartInfo("powershell", args[0]);
i.UseShellExecute = false;
using(Process p = Process.Start(i)) {
p.WaitForExit();
return p.ExitCode;
}
}
}
И, наконец, ваш скрипт "видимости":
# file "visibility.ps1"
(dir HKLM:\SOFTWARE).count - (dir HKLM:\SOFTWARE\wow6432node).count
Запуск сценария входа из 32-битной Powershell теперь дает желаемый результат (чтобы показать, что я не обманываю, я сначала запускаю сценарий видимости напрямую, а затем используя нашу технику вилки):
http://img3.imageshack.us/img3/2766/powershellrunc.png
person
Milan Gardian
schedule
10.03.2009