CreateProcessWithLogonw 错误需要提升

Posted

技术标签:

【中文标题】CreateProcessWithLogonw 错误需要提升【英文标题】:CreateProcessWithLogon Error requires elevation 【发布时间】:2011-01-17 12:35:23 【问题描述】:

全部 我正在使用 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)

谢谢, 森提尔

【问题讨论】:

错误信息告诉你问题所在。该操作需要抬高。我建议您先阅读并了解 UAC,然后再提出任何问题。 【参考方案1】:

参见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 调用的应用程序的权限

Alternativeley,您可以使用 CreateProcessWithLogon 调用 cmd /c cd <targetDir>&<targetDrive>:&<execName> 以避免创建该中间进程。

【讨论】:

【参考方案2】:

可能的原因是你使用了LOGON_WITH_PROFILE 标志。在CreateProcessWithLogonW 文档的“备注”部分,您可以阅读以下内容

默认情况下,CreateProcessWithLogonW 不加载指定用户 配置文件到 HKEY_USERS 注册表 钥匙。这意味着访问 HKEY_CURRENT_USER 中的信息 注册表项可能不会产生结果 符合正常的 交互式登录。这是你的 加载用户的责任 注册表配置单元到 HKEY_USERS 之前 通过调用 CreateProcessWithLogonW 使用 LOGON_WITH_PROFILE,或通过 调用 LoadUserProfile 函数。

所以我建议您尝试不带LOGON_WITH_PROFILE 标志的相同代码。如果您发现这是问题所在,并且确实需要使用标志,则应在代码中使用 LoadUserProfile 函数和 UnloadUserProfile。

【讨论】:

不是这样,UAC正在阻止他。 @Hans Passant:我不确定你是否正确。在 CreateProcessAsUser 的文档中(参见msdn.microsoft.com/en-us/library/ms682429(v=VS.85).aspx),您可以阅读“CreateProcessWithLogonW 不需要特殊权限,但必须允许指定的用户帐户以交互方式登录。通常,最好使用 CreateProcessWithLogonW 创建具有备用凭据的进程。 ”。所以看来CreateProcessWithLogonW 应该独立于 UAC 工作。但是 senthil 可以轻松测试它。

以上是关于CreateProcessWithLogonw 错误需要提升的主要内容,如果未能解决你的问题,请参考以下文章

CreateProcessWithLogonw 错误需要提升

CreateProcessWithLogonW 错误 1783:存根收到错误数据

如何通过内部命令使用CreateProcessWithLogonW

使用 CreateProcessWithLogonW 从服务启动的进程立即终止

在没有新控制台的情况下使用 CreateProcessWithLogonW() 执行 CMD.EXE

CreateProcessWithLogonW(好像可以指定进程的上下文环境)