Security Win32:使用用户/密码绕过UAC

Security Win32:使用用户/密码绕过UAC,security,winapi,login,uac,Security,Winapi,Login,Uac,我正在寻找一种方法来提升线程或进程的执行权限,而不出现UAC弹出窗口。 运行该进程的用户是管理员用户,我有他的用户名和密码 我需要这样做,以便进行一些管理工作,如重新启动服务和将文件写入系统目录。我的应用程序是远程运行的,没有交互用户来确认UAC对话框。禁用UAC不是一个选项 我已经试着用LogonUser(),ImpersonateLoggedOnUser(),CreateProcessAsUser()和DuplicateTokenEx()来处理好几天了,但都没能找到正确的组合,如果可能的话

我正在寻找一种方法来提升线程或进程的执行权限,而不出现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上运行的,我相信您可以使用任务调度器绕过UAC提示。在此处找到一组说明:


这将是一些工作,但肯定可以通过代码来完成。

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

尝试登录该用户或该用户,您将一事无成。问题不在于用户,而在于您请求管理员权限的上下文。即使是管理员也必须确认UAC提示

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


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

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

,这可能会给出提示;我不认为你能做到这一点;它可能需要使用模拟令牌启动一个单独的进程。@Luke启动一个新进程是可以的,但我无法使用
CreateProcessAsUser
来解决这个问题。有什么想法吗?@Luke:这确实是请求提升的一个强制性步骤,但它无助于跳过UAC提示。我在某个地方读到,您可以通过LogonUser(网络)获取非拆分令牌,通过CreateProcessAsUser()使用该令牌启动一个新进程,然后通过ShellExecute(“runas”)启动另一个进程并在没有UAC提示的情况下获得完整的管理流程。不知道这是真是假,但值得一试。要安装服务,我需要通过UAC,所以我们有鸡和蛋。@shoosh那么你是不是在第一次安装应用程序时就试图避免UAC?或者你的应用程序已经安装了吗?关键是你只需要安装一次服务,而不是每次提升应用程序的进程。正如Serge所说,如果UAC能被轻易击败,那将毫无意义。您需要完全的管理员权限来创建计划任务。这可以通过“at”命令完成。在UAC下调用它将返回“拒绝访问”