C # Процесс запуска БЕЗ Права администратора [дубликат]

Вы можете получить один элемент, запустив

document.querySelector('.myElement').style.size = '100px';

, но он будет работать для первого элемента с классом .myElement.

Если вы хотите применить это для всех элементы с классом я предлагаю вам использовать

document.querySelectorAll('.myElement').forEach(function(element) {
    element.style.size = '100px';
});
29
задан slugster 23 June 2012 в 13:34
поделиться

9 ответов

То, чего вы пытаетесь достичь, не может быть сделано очень легко и не поддерживается. Тем не менее, это возможно с помощью модификации взлома. Аарон Маргозис написал статью , описывающую один метод.

Чтобы процитировать соответствующий раздел, вам необходимо выполнить следующие шаги:

  1. Включить SeIncreaseQuotaPrivilege в вашем текущем токене
  2. Получить HWND, представляющий оболочку рабочего стола (GetShellWindow)
  3. Получить идентификатор процесса (PID) процесса, связанного с этим окном (GetWindowThreadProcessId)
  4. Открыть этот процесс (OpenProcess)
  5. Получить токен доступа из этого процесса (OpenProcessToken)
  6. Сделать основной токен с этим токеном (DuplicateTokenEx)
  7. Запустите новый процесс с помощью этого первичного токена (CreateProcessWithTokenW)

В статье содержится ссылка для загрузки некоторого демо-источника C ++, из которого он должен быть достаточно простым, чтобы перевести на C #.

9
ответ дан David Heffernan 21 August 2018 в 16:52
поделиться
  • 1
    Ссылка, которую вы мне дали, отлично поработала! Я не знаю, c ++ Я попытаюсь преобразовать этот код в c #. Я отвечу на ваш ответ, как только переполнение стека позволит мне. Благодаря! – Tono Nam 28 June 2013 в 01:26
  • 2
    @Tono, эта же ссылка была упомянута в ответе , опубликованном более чем за год до этого. – TLama 23 August 2015 в 07:36
  • 3
    есть ли доступ к C #? – Alessio 29 October 2015 в 16:17
  • 4
    Ошибка CreateProcessWithTokenW для меня. Я нашел здесь другой подход, который хорошо работает code.msdn.microsoft.com/windowsapps/… – tdemay 25 February 2017 в 00:22
  • 5
    Если CreateProcessWithTokenW терпит неудачу, это может быть, если «Служба вторичного входа в систему» выключен. К сожалению, многие так называемые "оптимизационные" веб-сайты рекомендуют отключить этот «ненужный». оказание услуг. Метод IShellDispatch2 представляется более надежным в этом отношении, потому что он не требует, чтобы эта служба работала. Недостатком является то, что он дает меньше контроля над тем, как создается процесс. – zett42 28 August 2017 в 12:44

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

#Region "References"

Imports System.Runtime.InteropServices

#End Region

Public Class LaunchProcess

#Region "Native Methods"

    <DllImport("User32.dll", SetLastError:=True)> Private Shared Function GetShellWindow() As IntPtr
    End Function

    <DllImport("advapi32.dll", SetLastError:=True)> Private Shared Function OpenProcessToken(ByVal ProcessHandle As IntPtr, ByVal DesiredAccess As Integer, ByRef TokenHandle As IntPtr) As Boolean
    End Function

    <DllImport("user32.dll", SetLastError:=True)> Private Shared Function GetWindowThreadProcessId(ByVal hwnd As IntPtr, ByRef lpdwProcessId As IntPtr) As Integer
    End Function

    <DllImport("kernel32.dll")> Private Shared Function OpenProcess(ByVal dwDesiredAccess As UInteger, <MarshalAs(UnmanagedType.Bool)> ByVal bInheritHandle As Boolean, ByVal dwProcessId As IntPtr) As IntPtr
    End Function

    <DllImport("advapi32.dll", SetLastError:=True)> _
    Private Shared Function DuplicateTokenEx( _
    ByVal ExistingTokenHandle As IntPtr, _
    ByVal dwDesiredAccess As UInt32, _
    ByRef lpThreadAttributes As SECURITY_ATTRIBUTES, _
    ByVal ImpersonationLevel As Integer, _
    ByVal TokenType As Integer, _
    ByRef DuplicateTokenHandle As System.IntPtr) As Boolean
    End Function

    <DllImport("advapi32.dll", SetLastError:=True)> Private Shared Function LookupPrivilegeValue(lpSystemName As String, lpName As String, ByRef lpLuid As LUID) As Boolean
    End Function

    <DllImport("advapi32.dll", SetLastError:=True)> _
    Private Shared Function AdjustTokenPrivileges( _
    ByVal TokenHandle As IntPtr, _
    ByVal DisableAllPrivileges As Boolean, _
    ByRef NewState As TOKEN_PRIVILEGES, _
    ByVal BufferLengthInBytes As Integer, _
    ByRef PreviousState As TOKEN_PRIVILEGES, _
    ByRef ReturnLengthInBytes As Integer _
  ) As Boolean
    End Function

    <DllImport("advapi32", SetLastError:=True, CharSet:=CharSet.Unicode)> Private Shared Function CreateProcessWithTokenW(hToken As IntPtr, dwLogonFlags As Integer, lpApplicationName As String, lpCommandLine As String, dwCreationFlags As Integer, lpEnvironment As IntPtr, lpCurrentDirectory As IntPtr, ByRef lpStartupInfo As STARTUPINFO, ByRef lpProcessInformation As PROCESS_INFORMATION) As Boolean
    End Function

#End Region

#Region "Structures"

    <StructLayout(LayoutKind.Sequential)> Private Structure SECURITY_ATTRIBUTES

        Friend nLength As Integer
        Friend lpSecurityDescriptor As IntPtr
        Friend bInheritHandle As Integer

    End Structure

    Private Structure TOKEN_PRIVILEGES

        Friend PrivilegeCount As Integer
        Friend TheLuid As LUID
        Friend Attributes As Integer

    End Structure

    Private Structure LUID

        Friend LowPart As UInt32
        Friend HighPart As UInt32

    End Structure

    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Private Structure STARTUPINFO

        Friend cb As Integer
        Friend lpReserved As String
        Friend lpDesktop As String
        Friend lpTitle As String
        Friend dwX As Integer
        Friend dwY As Integer
        Friend dwXSize As Integer
        Friend dwYSize As Integer
        Friend dwXCountChars As Integer
        Friend dwYCountChars As Integer
        Friend dwFillAttribute As Integer
        Friend dwFlags As Integer
        Friend wShowWindow As Short
        Friend cbReserved2 As Short
        Friend lpReserved2 As Integer
        Friend hStdInput As Integer
        Friend hStdOutput As Integer
        Friend hStdError As Integer

    End Structure

    Private Structure PROCESS_INFORMATION

        Friend hProcess As IntPtr
        Friend hThread As IntPtr
        Friend dwProcessId As Integer
        Friend dwThreadId As Integer

    End Structure

#End Region

#Region "Enumerations"

    Private Enum TOKEN_INFORMATION_CLASS

        TokenUser = 1
        TokenGroups
        TokenPrivileges
        TokenOwner
        TokenPrimaryGroup
        TokenDefaultDacl
        TokenSource
        TokenType
        TokenImpersonationLevel
        TokenStatistics
        TokenRestrictedSids
        TokenSessionId
        TokenGroupsAndPrivileges
        TokenSessionReference
        TokenSandBoxInert
        TokenAuditPolicy
        TokenOrigin
        TokenElevationType
        TokenLinkedToken
        TokenElevation
        TokenHasRestrictions
        TokenAccessInformation
        TokenVirtualizationAllowed
        TokenVirtualizationEnabled
        TokenIntegrityLevel
        TokenUIAccess
        TokenMandatoryPolicy
        TokenLogonSid
        MaxTokenInfoClass

    End Enum

#End Region

#Region "Constants"

    Private Const SE_PRIVILEGE_ENABLED = &H2L
    Private Const PROCESS_QUERY_INFORMATION = &H400
    Private Const TOKEN_ASSIGN_PRIMARY = &H1
    Private Const TOKEN_DUPLICATE = &H2
    Private Const TOKEN_IMPERSONATE = &H4
    Private Const TOKEN_QUERY = &H8
    Private Const TOKEN_QUERY_SOURCE = &H10
    Private Const TOKEN_ADJUST_PRIVILEGES = &H20
    Private Const TOKEN_ADJUST_GROUPS = &H40
    Private Const TOKEN_ADJUST_DEFAULT = &H80
    Private Const TOKEN_ADJUST_SESSIONID = &H100
    Private Const SecurityImpersonation = 2
    Private Const TokenPrimary = 1
    Private Const SE_INCREASE_QUOTA_NAME = "SeIncreaseQuotaPrivilege"

#End Region

#Region "Methods"

    Friend Shared Sub LaunchFile(ByVal FilePath As String, ByVal IsWaitToFinish As Boolean)

        Try

            'Enable the SeIncreaseQuotaPrivilege in current token
            Dim HPrcsToken As IntPtr = Nothing
            OpenProcessToken(Process.GetCurrentProcess.Handle, TOKEN_ADJUST_PRIVILEGES, HPrcsToken)

            Dim TokenPrvlgs As TOKEN_PRIVILEGES
            TokenPrvlgs.PrivilegeCount = 1
            LookupPrivilegeValue(Nothing, SE_INCREASE_QUOTA_NAME, TokenPrvlgs.TheLuid)
            TokenPrvlgs.Attributes = SE_PRIVILEGE_ENABLED

            AdjustTokenPrivileges(HPrcsToken, False, TokenPrvlgs, 0, Nothing, Nothing)

            'Get window handle representing the desktop shell
            Dim HShellWnd As IntPtr = GetShellWindow()

            'Get the ID of the desktop shell process
            Dim ShellPID As IntPtr
            GetWindowThreadProcessId(HShellWnd, ShellPID)

            'Open the desktop shell process in order to get the process token
            Dim HShellPrcs As IntPtr = OpenProcess(PROCESS_QUERY_INFORMATION, False, ShellPID)
            Dim HShellPrcSToken As IntPtr = Nothing
            Dim HPrimaryToken As IntPtr = Nothing

            'Get the process token of the desktop shell
            OpenProcessToken(HShellPrcs, TOKEN_DUPLICATE, HShellPrcSToken)

            'Duplicate the shell's process token to get a primary token
            Dim TokenRights As UInteger = TOKEN_QUERY Or TOKEN_ASSIGN_PRIMARY Or TOKEN_DUPLICATE Or TOKEN_ADJUST_DEFAULT Or TOKEN_ADJUST_SESSIONID
            DuplicateTokenEx(HShellPrcSToken, TokenRights, Nothing, SecurityImpersonation, TokenPrimary, HPrimaryToken)

            Dim StartInfo As STARTUPINFO = Nothing
            Dim PrcsInfo As PROCESS_INFORMATION = Nothing

            StartInfo.cb = Marshal.SizeOf(StartInfo)
            Dim IsSuccessed As Boolean = CreateProcessWithTokenW(HPrimaryToken, 1, FilePath, "", 0, Nothing, Nothing, StartInfo, PrcsInfo)

            If IsSuccessed = True Then

                If IsWaitToFinish = True Then

                    Try

                        Dim Prcs As Process = Process.GetProcessById(PrcsInfo.dwProcessId)
                        Prcs.WaitForExit()

                    Catch ex As Exception
                    End Try

                End If

            Else

                'Could not launch process with shell token may be the process needs admin rights to launch, we will try to launch it with default parent process permissions.

                Dim Prcs As New Process
                Prcs.StartInfo.FileName = FilePath
                Prcs.Start()

                If IsWaitToFinish = True Then Prcs.WaitForExit()

            End If

        Catch ex As Exception
        End Try

    End Sub

#End Region

End Class

Использование класса LaunchProcess

LaunchProcess.LaunchFile("C:\Program Files\Test\text.exe", False)

Вы можете использовать конвертер кода Telerik для конвертировать код в C # http://converter.telerik.com/

1
ответ дан Ahmed Osama 21 August 2018 в 16:52
поделиться

Я столкнулся с аналогичной проблемой. В processstartinfo есть поле пароля, уловка заключается в том, что вы должны предоставить пароль в качестве защищенной строки. Таким образом, код будет выглядеть следующим образом:

System.Security.SecureString password = new System.Security.SecureString();
password.AppendChar('c1');
//append the all characters of your password, you could probably use a loop and then,
Process p =new Process();
p.UseShellExecute = false;
p.UserName = Environment.UserName;
p.FileName = file ;
p.Sassword=password;
p.Start();
2
ответ дан Aster Veigas 21 August 2018 в 16:52
поделиться
  • 1
    wow он отлично работает, но вам нужно использовать правильный пароль! – Tono Nam 3 September 2013 в 20:01
  • 2
    да, вам нужен правильный пароль. Я нашел это легче по сравнению с лучшим ответом на этом форуме – Aster Veigas 3 September 2013 в 20:07
  • 3
    Это не так просто, если вы не знаете пароль. Как вы можете надеяться узнать пароль, если у вас нет коробки? – David Heffernan 23 August 2015 в 14:41

Это действительно старый вопрос, который я видел много лет назад и сейчас пересматривал. После первого результата поиска Google ... Я отправлю свой ответ здесь.

Все решения, которые я нашел, чрезвычайно сложны и смешны. На протяжении многих лет я натыкался на решение, которое я не видел нигде, и до сих пор не разделял его.

Код очень прост ... По сути, мы пишем командный файл с именем / контуром исполняемого файла процесса, который вы хотите запустить, с любыми аргументами, которые вы хотите. Затем мы запускаем процесс explorer.exe с указанием пути к пакетному файлу ...

File.WriteAllText(@"C:\test.bat", @"C:\test.exe -randomArgs");

var proc = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = "explorer.exe",
        Arguments = @"C:\test.bat",
        UseShellExecute = true,
        Verb = "runas",
        WindowStyle = ProcessWindowStyle.Hidden
    }
};
proc.Start();

Процесс проводника, который мы запускаем, немедленно уничтожается операционной системой, однако! Процесс запуска root explorer.exe запускает командный файл! Вы можете дать explorer.exe имя вашего исполняемого файла, и оно будет делать то же самое, однако этот метод не поддерживает аргументы.

Для всех, кого я знаю, это ошибка или недокументированная функция. Однако я не могу себе представить, как это можно использовать злонамеренно, поскольку это позволяет отменять права доступа ... Это работает в Windows 7/8 / 8.1 / 10.

3
ответ дан Eugene 21 August 2018 в 16:52
поделиться

В Codeplex есть помощники управления учетными записями пользователей .

Проект предоставляет библиотеку для взаимодействия с механизмом UAC.

В библиотеки вы найдете класс под названием UserAccountControl. Класс имеет статический метод, называемый CreateProcessAsStandardUser, чтобы начать процесс с повышенного процесса со стандартными правами пользователя.

Короче говоря, функции открывают токен процесса процесса оболочки рабочего стола. Затем он дублирует этот токен, чтобы получить первичный токен. Этот токен затем используется для запуска нового процесса под зарегистрированным пользователем.

Для получения дополнительной информации, пожалуйста, прочитайте следующее сообщение в блоге из Aaron Margosis .

3
ответ дан Hans 21 August 2018 в 16:52
поделиться

Предполагая, что вы сигнализируете, что приложение закрывается, а не завершает его, и если вы все еще можете внести изменения в приложение перед выпуском вашего обновления, одним простым решением было бы запустить приложение промежуточным процессом до выход. Вы можете создать исполняемый файл для промежуточного процесса во временном месте. Когда обновление будет завершено, сообщите временному процессу, чтобы перезапустить приложение и выйти. Таким образом, все происходит естественно, и вам не нужно путаться.

Другим вариантом было бы использовать OpenProcess , OpenProcessToken , и DuplicateToken , чтобы получить копию токена безопасности приложения, прежде чем убить его. Затем вы можете использовать CreateProcessAsUser для возобновления приложения в исходном контексте.

Оба этих подхода должны работать, даже если программа обновления работает под другой учетной записью и / или в другой сеанс для приложения.

6
ответ дан Harry Johnston 21 August 2018 в 16:52
поделиться

Вы можете использовать функцию CreateProcessWithLogonW или аналогичные CreateProcessAsUser и CreateProcessWithTokenW .

0
ответ дан Jacob Seleznev 21 August 2018 в 16:52
поделиться

Код C # для статьи Aaron Margosis :

        private static void RunAsDesktopUser(string fileName)
    {
        if (string.IsNullOrWhiteSpace(fileName))
            throw new ArgumentException("Value cannot be null or whitespace.", nameof(fileName));

        // To start process as shell user you will need to carry out these steps:
        // 1. Enable the SeIncreaseQuotaPrivilege in your current token
        // 2. Get an HWND representing the desktop shell (GetShellWindow)
        // 3. Get the Process ID(PID) of the process associated with that window(GetWindowThreadProcessId)
        // 4. Open that process(OpenProcess)
        // 5. Get the access token from that process (OpenProcessToken)
        // 6. Make a primary token with that token(DuplicateTokenEx)
        // 7. Start the new process with that primary token(CreateProcessWithTokenW)

        var hProcessToken = IntPtr.Zero;
        // Enable SeIncreaseQuotaPrivilege in this process.  (This won't work if current process is not elevated.)
        try
        {
            var process = GetCurrentProcess();
            if (!OpenProcessToken(process, 0x0020, ref hProcessToken))
                return;

            var tkp = new TOKEN_PRIVILEGES
            {
                PrivilegeCount = 1,
                Privileges = new LUID_AND_ATTRIBUTES[1]
            };

            if (!LookupPrivilegeValue(null, "SeIncreaseQuotaPrivilege", ref tkp.Privileges[0].Luid))
                return;

            tkp.Privileges[0].Attributes = 0x00000002;

            if (!AdjustTokenPrivileges(hProcessToken, false, ref tkp, 0, IntPtr.Zero, IntPtr.Zero))
                return;
        }
        finally
        {
            CloseHandle(hProcessToken);
        }

        // Get an HWND representing the desktop shell.
        // CAVEATS:  This will fail if the shell is not running (crashed or terminated), or the default shell has been
        // replaced with a custom shell.  This also won't return what you probably want if Explorer has been terminated and
        // restarted elevated.
        var hwnd = GetShellWindow();
        if (hwnd == IntPtr.Zero)
            return;

        var hShellProcess = IntPtr.Zero;
        var hShellProcessToken = IntPtr.Zero;
        var hPrimaryToken = IntPtr.Zero;
        try
        {
            // Get the PID of the desktop shell process.
            uint dwPID;
            if (GetWindowThreadProcessId(hwnd, out dwPID) == 0)
                return;

            // Open the desktop shell process in order to query it (get the token)
            hShellProcess = OpenProcess(ProcessAccessFlags.QueryInformation, false, dwPID);
            if (hShellProcess == IntPtr.Zero)
                return;

            // Get the process token of the desktop shell.
            if (!OpenProcessToken(hShellProcess, 0x0002, ref hShellProcessToken))
                return;

            var dwTokenRights = 395U;

            // Duplicate the shell's process token to get a primary token.
            // Based on experimentation, this is the minimal set of rights required for CreateProcessWithTokenW (contrary to current documentation).
            if (!DuplicateTokenEx(hShellProcessToken, dwTokenRights, IntPtr.Zero, SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation, TOKEN_TYPE.TokenPrimary, out hPrimaryToken))
                return;

            // Start the target process with the new token.
            var si = new STARTUPINFO();
            var pi = new PROCESS_INFORMATION();
            if (!CreateProcessWithTokenW(hPrimaryToken, 0, fileName, "", 0, IntPtr.Zero, Path.GetDirectoryName(fileName), ref si, out pi))
                return;
        }
        finally
        {
            CloseHandle(hShellProcessToken);
            CloseHandle(hPrimaryToken);
            CloseHandle(hShellProcess);
        }

    }

    #region Interop

    private struct TOKEN_PRIVILEGES
    {
        public UInt32 PrivilegeCount;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
        public LUID_AND_ATTRIBUTES[] Privileges;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    private struct LUID_AND_ATTRIBUTES
    {
        public LUID Luid;
        public UInt32 Attributes;
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct LUID
    {
        public uint LowPart;
        public int HighPart;
    }

    [Flags]
    private enum ProcessAccessFlags : uint
    {
        All = 0x001F0FFF,
        Terminate = 0x00000001,
        CreateThread = 0x00000002,
        VirtualMemoryOperation = 0x00000008,
        VirtualMemoryRead = 0x00000010,
        VirtualMemoryWrite = 0x00000020,
        DuplicateHandle = 0x00000040,
        CreateProcess = 0x000000080,
        SetQuota = 0x00000100,
        SetInformation = 0x00000200,
        QueryInformation = 0x00000400,
        QueryLimitedInformation = 0x00001000,
        Synchronize = 0x00100000
    }

    private enum SECURITY_IMPERSONATION_LEVEL
    {
        SecurityAnonymous,
        SecurityIdentification,
        SecurityImpersonation,
        SecurityDelegation
    }

    private enum TOKEN_TYPE
    {
        TokenPrimary = 1,
        TokenImpersonation
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct PROCESS_INFORMATION
    {
        public IntPtr hProcess;
        public IntPtr hThread;
        public int dwProcessId;
        public int dwThreadId;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    private struct STARTUPINFO
    {
        public Int32 cb;
        public string lpReserved;
        public string lpDesktop;
        public string lpTitle;
        public Int32 dwX;
        public Int32 dwY;
        public Int32 dwXSize;
        public Int32 dwYSize;
        public Int32 dwXCountChars;
        public Int32 dwYCountChars;
        public Int32 dwFillAttribute;
        public Int32 dwFlags;
        public Int16 wShowWindow;
        public Int16 cbReserved2;
        public IntPtr lpReserved2;
        public IntPtr hStdInput;
        public IntPtr hStdOutput;
        public IntPtr hStdError;
    }

    [DllImport("kernel32.dll", ExactSpelling = true)]
    private static extern IntPtr GetCurrentProcess();

    [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
    private static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);

    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern bool LookupPrivilegeValue(string host, string name, ref LUID pluid);

    [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
    private static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall, ref TOKEN_PRIVILEGES newst, int len, IntPtr prev, IntPtr relen);

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool CloseHandle(IntPtr hObject);


    [DllImport("user32.dll")]
    private static extern IntPtr GetShellWindow();

    [DllImport("user32.dll", SetLastError = true)]
    private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr OpenProcess(ProcessAccessFlags processAccess, bool bInheritHandle, uint processId);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool DuplicateTokenEx(IntPtr hExistingToken, uint dwDesiredAccess, IntPtr lpTokenAttributes, SECURITY_IMPERSONATION_LEVEL impersonationLevel, TOKEN_TYPE tokenType, out IntPtr phNewToken);

    [DllImport("advapi32", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern bool CreateProcessWithTokenW(IntPtr hToken, int dwLogonFlags, string lpApplicationName, string lpCommandLine, int dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, [In] ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation);

    #endregion
7
ответ дан user3122201 21 August 2018 в 16:52
поделиться
  • 1
    Это было отличное начало, спасибо! Достаточно легко расширить его, чтобы вернуть объект Process и передать аргументы: CreateProcessWithTokenW(hPrimaryToken, 0, fileName, $"\"{fileName}\" {arguments}",... и return Process.GetProcessById(pi.dwProcessId); Обратите внимание, что вы можете дождаться завершения процесса, но не проверить его код ошибки. – Andrew Hanlon 14 December 2016 в 05:30
  • 2
    как применить это решение для запуска моего собственного приложения Windows? – Antosha Shmonoff 10 July 2018 в 03:08

Как писатель описывает эту проблему, не решается. У меня такая же проблема, теперь я хочу описать, как я это решил.

Как вы знаете, это не так просто, но лучшим решением является то, что вы вынуждаете компьютер запускать файл «* .exe» другим, -админ. То, что я делал, - это создание задачи в параметрах планировщика заданий without Highest Privilege. Это означает, что нужно выполнить время или запустить эту задачу вручную.

Кажется, это глупо, но, похоже, нет способа.

Вы можете увидеть эту ссылку , в которой описывается, как создать новую задачу для планировщика задач Windows /

0
ответ дан ᔕIᑎᗩ KᗩᖇᐯᗩᑎᗪI 21 August 2018 в 16:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: