分享

Windows7编程:让程序获得管理员权限

 herowuking 2014-12-03

相对于Windows XP,Windows Vista 和Windows 7增加了系统安全性。它们引入了一个新的feature叫UAC(User Account Control),即用户账号控制。

微软发现,在XP时代,用户都喜欢用管理员账号登陆和使用系统,这样避免了很多操作系统对普通用户的限制,感觉用起来无拘无束。但是因为管理员账号意味着管理员权限,如果用户电脑上有恶意软件(经常上网的人其实很容易中招),那么恶意软件同样获得了管理员权限,就可以对你的机器为所欲为。

鉴于用户的这种习惯,Windows Vista以后引入了UAC。有了它以后,即使你是用管理员账号登陆系统,系统也不会默认给你所有的程序管理员权限。系统会自动给你标准用户(普通用户)的权限。因为一般的程序根本不需要管理员权限,所以大部分时候用户都很happy,没有察觉异样。但是当一个程序需要管理员权限的时候,UAC会弹出一个窗口告知用户,并征求用户意见是否给予程序相应的权限,或者直接警告用户这个程序是恶意软件,正要在后台干坏事。这个时候用户就感觉被打扰了,如果有个红色的惊叹号(大部分不是红色),就会变得突然很紧张。这个时候,用户就有权授予程序管理员权限,也有权阻止程序继续运行。这一点保证了系统的安全。如果是用户信任的程序,用户就可以安全的让它继续运行了。

所以Windows 7上面运行的程序都需要在代码里面利用UAC。如果需要管理员权限,需要在代码里面请求提升程序的权限。如果不这样做,用户使用程序的时候就会因为得不到管理员权限而出现莫名其妙的问题,然后抱怨接踵而来,然后你需要告诉他们右键单击程序图标,在上下文菜单里面选“以管理员身份运行”。然后用户又会抱怨,每次这样做很麻烦,能不能设置一下不用每次点右键。然后你又要不厌其烦的告诉他们,可以啊,你点右键,在某某选项卡里面设置“以管理员身份运行”就OK了呀。。。没完没了。

不废话了,下面的代码源自《Windows via C/C++》,版权属于原书作者。:Copyright (c) 2008 Jeffrey Richter & Christophe Nasarre

这个程序经过些许修改,在Windows XP + VC6编译通过,并在Windows 7下面测试通过。程序很简单,这里不解释了。关键的代码在 sei.lpVerb = TEXT("runas"); 这一句。这一句的作用是请求以管理员身份运行程序。运行以后操作系统会弹出对话框告知用户,程序需要管理员权限,请求用户授权。

最后说一句,不要在控制面板里面关闭UAC,虽然那样做系统就不会再打扰你了,但是你的系统就卸甲了。

 

#include <stdafx.h>

#include <aclapi.h>    

#include <Shellapi.h>
#include <tchar.h>

void main()
{
// Initialize the structure.
SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };

// Ask for privileges elevation.
sei.lpVerb = TEXT("runas");

// Create a Command Prompt from which you will be able to start
// other elevated applications.
sei.lpFile = TEXT("cmd.exe");

// run some commands in the command line.
sei.lpParameters = _T("/k echo hello world!");

// Don't forget this parameter; otherwise, the window will be hidden.
sei.nShow = SW_SHOWNORMAL;

if (!ShellExecuteEx(&sei)) {
   DWORD dwStatus = GetLastError();

   if (dwStatus == ERROR_CANCELLED) {
      // The user refused to allow privileges elevation.
   }
   else
   if (dwStatus == ERROR_FILE_NOT_FOUND) {
     // The file defined by lpFile was not found and
     // an error message popped up.
   }
}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多