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 从服务启动的进程立即终止