以特定的用户身份运行某个程序命令
本文将介绍一个控制台实用程序,在 Windows NT 系统中运行,它以专门的用户身份启动某个程序命令。它用 Windows API 函数 LogonUser 编程,以专门的用户身份/密码登陆到NT。如果登陆成功,则用 CreateProcessAsUseris 产生该用户的专属进程。程序运行截图如下:
LogonUser API调用要求调用者必须具备相当高级别的权限:比如:“Act as part of the operating system”,这是一个不能随便给出的特权,权力极大。本地管理员常常都不会有这个权限。作为工作环境,本文介绍的实用程序因为要执行某些系统调用,所以要首先检查用户是否具备必要的特权,如果没有这种特权则发生如下情况:
- 实用程序临时将自己作为服务程序安装并在系统账号下运行;
- 启动新的服务,参数(用户名,进程)必须通过共享内存传递给服务;
- 然后服务程序试图以特定用户登录并启动进程,通过共享内存将结果返回实用程序;
- 然后实用程序终止服务,卸载服务并显示结果;
这样做是能行得通的,因为系统账号具有高级特权,同时,本地管理员组有安装服务的权限,实用程序的使用说明可以在命令行敲入程序名,不用带参数,然后回车。
源代码还包含如下的技术内容:
- Windows 安全APIs(包括轻量级模板类,用于处理 SIDs、ACEs、ACLs、安全描述符、特权和访问令牌);
- 使用服务控制管理器编程以安装/配置服务;
- 编写NT服务(包括一个服务模板类,使用这个类只要20行代码便可以实现一个简单的服务);
- 使用内存映射文件来共享内存(包含一个模板类,使用这个类可以实现内存映射文件以及其它轻量级Kernel对象的自动管理)