Как олицетворять текущий процесс как SYSTEM на Windows XP? - PullRequest
0 голосов
/ 01 апреля 2019

Процесс изначально запускается от имени пользователя (с правами администратора).В какой-то момент я хочу переименовать файл, принадлежащий пользователю SYSTEM.Поэтому мне нужно выдать себя за мой процесс как SYSTEM.

У меня есть код, который работает корректно на любых Windows XP и (и 2003):

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool OpenProcessToken(IntPtr processHandle, uint desiredAccess, out IntPtr tokenHandle);

...

var systemProcessId = Process.GetProcessesByName("wininit").First().Id;
var handle = OpenProcess(ProcessAllAccess, false, systemProcessId);
private IntPtr _token;
OpenProcessToken(handle, (uint) TokenAccessLevels.MaximumAllowed, out _token)
WindowsIdentity.Impersonate(_token);

Он не работает на Windows XP (и 2003).Как я могу получить тот же результат на XP и 2003?

...