我正在寻找一种方法来提升线程或进程的执行权限,而不会出现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上运行
答案 0 :(得分:4)
尝试登录此用户或该用户,您将无处可去。问题不在于用户,而是您要求管理员权限的上下文。甚至管理员也必须确认UAC提示。
如果您提出的问题是可能的,那将完全打败UAC概念。只要会话是交互式的(并且在Win7上,程序不是来自Windows候选名单,例如服务小程序),您将无法绕过提示。
正如其他人所说,通常的解决方案是编写服务并让您的交互式应用程序使用标准IPC机制(如命名管道)与服务进行通信。请注意在两端创建IPC对象时所需的安全描述符:用户上下文在服务和交互式应用程序中是不同的。
答案 1 :(得分:2)
通常,您需要绕过UAC的建议解决方案是编写服务。该服务将以完全权限运行,您的应用程序会要求它执行操作。
答案 2 :(得分:1)
我相信您可以使用任务计划程序绕过UAC提示。在这里找到一套说明: http://www.vikitech.com/253/create-shortcuts-for-trusted-programs-to-bypass-windows-7-uac-check
这将是一些工作,但它肯定可以通过代码完成。
答案 3 :(得分:1)
问题在于您提供了错误的模拟级别值(SecurityImpersonation变量)。它应该是一个神奇的数字"的 2 强>