2012-02-15 68 views
4

我正在寻找一种方法来提升线程或进程的执行权限,而不出现UAC弹出窗口。 运行该进程的用户是管理员用户,我有他的用户名和密码可用。Win32:绕过UAC使用用户/密码

我需要这样做,以便做一些管理的东西,如重新启动服务和写入文件到系统目录。我的应用程序远程运行,没有交互式用户来确认UAC对话框。禁用UAC不是一种选择。

我尝试杂耍LogonUser()ImpersonateLoggedOnUser()CreateProcessAsUser()DuplicateTokenEx()为更好的一部分,两天,但在这一切都无法找出正确的组合,如果甚至有可能。


具体是什么我已经试过是这样的:

HANDLE token = 0; 
LogonUserA(user, NULL, pass, LOGON32_LOGON_NETWORK_CLEARTEXT, LOGON32_PROVIDER_DEFAULT, &token); 
HANDLE impToken = 0; 
DuplicateToken(token, SecurityImpersonation, &impToken); 
ImpersonateLoggedOnUser(impToken); 
CreateFileA("C:\\windows\\blabla.dll", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

最后调用失败GetLastError() = 1346,“要么未提供所需的模拟级别,或提供的模拟级别无效。 “

我在做什么错?
注意 - 这是运行Win2008 R2

+3

这可能会提示; http://stackoverflow.com/questions/5098121/how-can-i-get-elevated-permissions-uac-via-impersonation-under-a-non-interacti – 2012-02-15 17:26:42

+0

我不认为你可以这样做内联;它可能需要启动一个单独的模拟令牌进程。 – Luke 2012-02-15 18:57:07

+0

@Luke启动一个新的过程是好的,但我无法弄清楚如何使用'CreateProcessAsUser'来做到这一点。有任何想法吗? – shoosh 2012-02-15 23:19:53

回答

2

通常,您需要绕过UAC的建议解决方案是编写一项服务。该服务将以完全权限运行,并且您的应用程序会要求它执行操作。

+0

要安装一个服务,我需要通过UAC,所以我们有一个鸡和鸡蛋。 – shoosh 2012-02-16 08:06:59

+0

@shoosh那么你是否试图在第一次安装应用程序时避免使用UAC?或者你的应用程序已经安装? – 2012-02-16 08:22:01

+1

问题是,您只需要安装一次服务*,而不是每次都提升应用程序的进程。正如塞尔所说,如果UAC可以被轻易击败,那就没有意义了。 – 2012-02-17 06:55:21

4

通过尝试登录该用户或该用户,您将无处可去。问题不在于用户,而在于您要求管理员权限的上下文。即使管理员也必须确认UAC提示。

如果你问的是可能的话,它将完全击败UAC概念。只要会话是交互式的(并且在Win7上,该程序不是来自Windows短名单,例如服务小程序),您将无法绕过提示。

正如其他人所说的,通常的解决方案是编写一个服务,让交互式应用程序使用标准IPC机制(如命名管道)与服务对话。请注意两端创建IPC对象时所需的安全描述符:服务和交互式应用程序中的用户上下文不同。

1

问题是您提供了一个错误的模拟级别值(SecurityImpersonation变量)。它应该是一个“幻数”