使用ShellExecute函数实现以管理员身份运行程序

Theevilspirit

发布日期: 2018-12-20 12:13:42 浏览量: 2595
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

背景

在 Win7 或者 Win7 以上版本的系统,我们想以管理员身份运行一个程序的时候,只需要选中这个程序文件,鼠标右击,选择“以管理员身份启动”就可以了。但是,在实际的编程中,我们要以管理员身份创建一个进程该怎么操作呢?

可能有人会想,创建一个进程,那使用 CreateProcess 函数创建就可以了。是的,CreateProcess 是可以创建一个进程,但是它不能以管理员权限创建进程。换句话说,它只能创建一个权限比它低或者相同权限的进程。若是一个普通进程,它就创建不了管理员权限进程。

本文要介绍的 ShellExecute 函数,可以实现创建管理员权限进程。但是,如果系统开启了UAC(用户账户控制),则会弹窗提示是否要以管理员权限运行。现在,我就把这个小程序实现的过程进行整理,分享给大家。

函数介绍

ShellExcute 函数

对指定的文件执行操作。

函数声明

  1. HINSTANCE ShellExecute(
  2. _In_opt_ HWND hwnd,
  3. _In_opt_ LPCTSTR lpOperation,
  4. _In_ LPCTSTR lpFile,
  5. _In_opt_ LPCTSTR lpParameters,
  6. _In_opt_ LPCTSTR lpDirectory,
  7. _In_ INT nShowCmd
  8. );

参数

  • hwnd [in]
    用于显示UI或错误消息的父窗口的句柄。如果操作未与窗口相关联,则此值可以为NULL。
  • lpOperation[in]
    指向以NULL结尾的字符串的指针,在本例中称为动词,用于指定要执行的操作。可用的动词集取决于特定的文件或文件夹。一般来说,从对象的快捷菜单中可以获得的动作是动词。
  • lpFile [in]
    指向以空值终止的字符串的指针,用于指定要在其上执行指定动词的文件或对象。要指定Shell命名空间对象,请传递完全限定的解析名称。请注意,并非所有对象都支持所有动词。例如,并非所有文档类型都支持“打印”动词。如果lpDirectory参数使用相对路径,则不要使用lpFile的相对路径。
  • lpParameters [in]
    如果lpFile指定了一个可执行文件,则该参数是一个指向空值终止字符串的指针,该字符串指定要传递给应用程序的参数。此字符串的格式由要调用的动词决定。如果lpFile指定文档文件,则lpParameters应为NULL。
  • lpDirectory [in]
    指向以空值终结的字符串的指针,该字符串指定操作的默认(工作)目录。如果此值为NULL,则使用当前工作目录。如果在lpFile中提供了相对路径,则不要使用lpDirectory的相对路径。
  • nShowCmd [in]
    指定应用程序在打开时如何显示的标志。如果lpFile指定了一个文档文件,那么该标志就被简单传递给相关应用程序。

返回值

  • 如果函数成功,则返回大于32的值。如果函数失败,则返回一个错误值,该值指示失败的原因。

实现过程

对于这个小程序,就直接调用 ShellExecute 函数进行实现就行,我们设置的执行操作是 “runas”,表示以管理员身份运行。

根据上面的函数介绍,我们一一查看下程序调用该函数的参数情况。第 1 个参数,设为NULL,不关联任何窗口句柄;第 2 个参数表示操作行为,其中,“runas”表示以管理员身份执行操作;第 3 个参数表示要执行该操作的文件路径;第 4、第 5 个操作设为NULL,不传递执行参数以及当前工作目录;第 6 个参数表示程序运行时的显示标志,其中,SW_SHOWNORMAL表示正常显示。

  1. // 以管理员身份运行程序
  2. HINSTANCE hRet = ::ShellExecute(NULL, "runas", pszFileName, NULL, NULL, SW_SHOWNORMAL);
  3. if (32 < (DWORD)hRet)
  4. {
  5. return TRUE;
  6. }

这样,我们只要传递程序路径,调用此函数,就可以编程实现以管理员身份运行程序了。

编程实现

  1. BOOL RunAsAdmiin(char *pszFileName)
  2. {
  3. // 以管理员身份运行程序
  4. HINSTANCE hRet = ::ShellExecute(NULL, "runas", pszFileName, NULL, NULL, SW_SHOWNORMAL);
  5. if (32 < (DWORD)hRet)
  6. {
  7. return TRUE;
  8. }
  9. return FALSE;
  10. }

程序测试

我们直接运行程序,传入要以管理云身份启动的程序路径。UAC成功弹窗,点击确定,程序成功以管理员身份执行。

总结

这个小程序,关键是对 ShellExecute 函数参数的理解,其中关键参数是第 2 个参数,指定了操作的行为 “runas”,以管理员身份运行。

此外,ShellExecute 函数的拓展函数 ShellExecuteEx,也可以使用相同的方式实现以管理员身份运行的功能。

参考

参考自《Windows黑客编程技术详解》一书

上传的附件 cloud_download ShellExcute_Test.7z ( 142.83kb, 20次下载 )

发送私信

不要靠提高嗓门获取自己的存在感,那样只是虚张声势

15
文章数
17
评论数
最近文章
eject