.NET 4.x Запуск приложения с правами админа из под службы - C#

Узнай цену своей работы

Формулировка задачи:

        public static bool StartProcessAndBypassUAC(String applicationName, out PROCESS_INFORMATION procInfo)
        {
            uint winlogonPid = 0;
            IntPtr hUserTokenDup = IntPtr.Zero, hPToken = IntPtr.Zero, hProcess = IntPtr.Zero;
            procInfo = new PROCESS_INFORMATION();
 
            uint dwSessionId = WTSGetActiveConsoleSessionId();
 
            Process[] processes = Process.GetProcessesByName("winlogon");
            foreach (Process p in processes)
            {
                if ((uint)p.SessionId == dwSessionId)
                {
                    winlogonPid = (uint)p.Id;
                }
            }
 
            hProcess = OpenProcess(MAXIMUM_ALLOWED, false, winlogonPid);
 
            if (!OpenProcessToken(hProcess, TOKEN_DUPLICATE, ref hPToken))
            {
                CloseHandle(hProcess);
                return false;
            }
 
            SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
            sa.Length = Marshal.SizeOf(sa);
 
            if (!DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, ref sa, (int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, (int)TOKEN_TYPE.TokenPrimary, ref hUserTokenDup))
            {
                CloseHandle(hProcess);
                CloseHandle(hPToken);
                return false;
            }
 
...................
        }
здесь всё нормально отрабатывает я получаю hPToken, а дальше по ссылкам из мануалов пытаюсь получить TokenLinkedToken через GetTokenInformation.
        public struct _TOKEN_LINKED_TOKEN
        {
            public IntPtr LinkedToken;
        }
 
        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool GetTokenInformation(
            IntPtr TokenHandle,
            TOKEN_INFORMATION_CLASS TokenInformationClass,
            IntPtr TokenInformation,
            uint TokenInformationLength,
            out uint ReturnLength);
 
public static bool StartProcessAndBypassUAC(String applicationName, out PROCESS_INFORMATION procInfo)
{
......
//Продолжение
            IntPtr newToken = IntPtr.Zero;
            uint size = 0;
            var first = GetTokenInformation(hPToken, TOKEN_INFORMATION_CLASS.TokenLinkedToken, IntPtr.Zero, 0, out size);
            IntPtr linkedTokenStructPtr = Marshal.AllocHGlobal((int)size);
 
            var second = GetTokenInformation(hPToken, TOKEN_INFORMATION_CLASS.TokenLinkedToken, linkedTokenStructPtr, size, out size);
            var linkedTokenStruct = (_TOKEN_LINKED_TOKEN)Marshal.PtrToStructure(linkedTokenStructPtr, typeof(_TOKEN_LINKED_TOKEN));
            var linkedToken = linkedTokenStruct.LinkedToken;
 
.....
}
параметры first и second равны false, да и сам linkedToken получает отрицательное значение =\ и естественно CreateProcessAsUser() не создаёт процесс.. в чём проблема ? ЗЫ Пользователь единственный в системе и соответственно в группе админов.

Решение задачи: «.NET 4.x Запуск приложения с правами админа из под службы»

textual
Листинг программы
Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.231 из 5
Похожие ответы