Ошибка CreateProcessWithLogon требует повышения прав - PullRequest
1 голос
/ 17 января 2011

все Я использую метод CreateProcessWithLogon для установки программного обеспечения для пользователей, не прошедших проверку подлинности, для установки программного обеспечения, он работал нормально для пользователей Windows XP, но это же приложение показывает ошибку, как показано на компьютере с Windows 7.

System.ComponentModel.Win32Exception (0x80004005): запрошенная операция требует повышения прав

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

я использую код следующим образом

Private Const LOGON_NETCREDENTIALS_ONLY As Integer = &H2
Private Const NORMAL_PRIORITY_CLASS As Integer = &H20
Private Const CREATE_DEFAULT_ERROR_MODE As Integer = &H4000000
Private Const CREATE_NEW_CONSOLE As Integer = &H10
Private Const CREATE_NEW_PROCESS_GROUP As Integer = &H200
Private Const LOGON_WITH_PROFILE As Integer = &H1
Private Const LOGON_WITH_PROFILE1 As Integer = 0


    Dim siStartup As STARTUPINFO
    Dim piProcess As PROCESS_INFORMATION
    Dim intReturn As Integer
    Dim bResult As Boolean = False
    Dim result As Integer
    Dim sFile, sArg As String

    IMP_USER_NAME = AppSettings("UserName")
    IMP_PASS_WORD = AppSettings("Password")
    IMP_DOMAIN_NAME = AppSettings("Domain")

    Try

        If sApplication.EndsWith(".msi") Then
            sApplication = sApplication & " " & """ALLUSERS=1"""
            sArg = "msiexec.exe /i """ & sApplication & """"
            sFile = vbNullString
        Else
            If bToExecute = False Then
                sArg = vbNullString
                sFile = sApplication
            Else
                sArg = "cmd /c """ & sApplication & """"
                sFile = vbNullString
            End If
        End If

        siStartup.cb = Marshal.SizeOf(siStartup)
        siStartup.dwFlags = 0


        intReturn = CreateProcessWithLogon(IMP_USER_NAME, IMP_DOMAIN_NAME, IMP_PASS_WORD, LOGON_WITH_PROFILE, sFile, sArg, _
                        NORMAL_PRIORITY_CLASS Or CREATE_DEFAULT_ERROR_MODE Or CREATE_NEW_CONSOLE Or CREATE_NEW_PROCESS_GROUP, _
                        IntPtr.Zero, IntPtr.Zero, siStartup, piProcess)

Спасибо, Senthil

Ответы [ 2 ]

1 голос
/ 11 августа 2015

См. http://blogs.msdn.com/b/cjacks/archive/2010/02/01/why-can-t-i-elevate-my-application-to-run-as-administrator-while-using-createprocesswithlogonw.aspx: вам нужен промежуточный процесс, который выполняет ShellExec() для повышения привилегий приложения, вызываемого с помощью CreateProcessWithLogon

Альтернативно, вы можете вызвать cmd /c cd <targetDir>&<targetDrive>:&<execName> с CreateProcessWithLogon, чтобы избежать создания этого промежуточного процесса.

0 голосов
/ 17 января 2011

Возможно, причина в том, что вы используете флаг LOGON_WITH_PROFILE.В разделе «Замечание» документации CreateProcessWithLogonW вы можете прочитать следующее

По умолчанию CreateProcessWithLogonW не загружает указанный профиль пользователя в раздел реестра HKEY_USERS.Это означает, что доступ к информации в разделе реестра HKEY_CURRENT_USER может не дать результатов, которые соответствуют обычному интерактивному входу в систему.Вы несете ответственность за загрузку куста реестра пользователей в HKEY_USERS перед вызовом CreateProcessWithLogonW, с помощью LOGON_WITH_PROFILE или с помощью функции LoadUserProfile.

Поэтому я рекомендую попробовать тот же код без флага LOGON_WITH_PROFILE,Если вы увидите, что это была проблема, и вам нужно использовать флаг, вы должны использовать в своем коде функцию LoadUserProfile и UnloadUserProfile .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...