一:

编译程序的时候设置一下

在项目属性--连接器--清单文件--UAC执行级别改为requireAdministrator

二:

void GainAdminPrivileges(CString strApp, UINT idd)
{
CString strCmd;
strCmd.Format (_T("/adminoption %d"), idd); SHELLEXECUTEINFO execinfo;
memset(&execinfo, 0, sizeof(execinfo));
execinfo.lpFile = strApp;
execinfo.cbSize = sizeof(execinfo);
execinfo.lpVerb = _T("runas");
execinfo.fMask = SEE_MASK_NO_CONSOLE;
execinfo.nShow = SW_SHOWDEFAULT;
execinfo.lpParameters = strCmd; ShellExecuteEx(&execinfo);
}

strApp是应用程序的路径idd我传的是1,但好像传几都没问题

BOOL ElevateCurrentProcess(CString sCmdLine)
{
TCHAR szPath[MAX_PATH] = {0}; if (::GetModuleFileName(NULL, szPath, MAX_PATH))
{
// Launch itself as administrator.
SHELLEXECUTEINFO sei = { sizeof(SHELLEXECUTEINFO) };
sei.lpVerb = _T("runas");
sei.lpFile = szPath;
sei.lpParameters = (LPCTSTR)sCmdLine;
// sei.hwnd = hWnd;
sei.nShow = SW_SHOWNORMAL; if (!ShellExecuteEx(&sei))
{
DWORD dwStatus = GetLastError();
if (dwStatus == ERROR_CANCELLED)
{
// The user refused to allow privileges elevation.
return FALSE;
}
else if (dwStatus == ERROR_FILE_NOT_FOUND)
{
// The file defined by lpFile was not found and
// an error message popped up.
return FALSE;
}
return FALSE;
}
return TRUE;
}
return FALSE;
}

如何获取正确的文件路径

当我们那些在Windows 7之前设计的应用程序遇到UAC Virtualization问题的时候,我们需要从新设计我们的代码,将文件写入到合适的位置。在改善既有代码,使之可以与Windows 7兼容的时候,我们应该确保以下几点:

  ——在运行的时候,应用程序只会将数据保存到每个用户预先定义的位置或者是%alluserprofile% 中定义的普通用户拥有访问权限的位置。

  ——确定你要写入数据的“已知文件夹”(Knownfolders)。通常,所有用户共用的公共数据文件应该写入到一个全局的公共的位置,这样所有用户都可以访问到。而其它数据则应该写入每个用户自己的文件夹。

  1 公共数据文件包括日志文件,配置文件(通常是INI或者XML文件),应用程序状态文件,比如保存的游戏进程等等。

  2 而属于每个用户的文档,则应该保持在文档目录下,或者是用户自己指定的目录。

  ——当你确定合适的文件保存位置后,不要在代码中明文写出(Hard-code)你选择的路径。为了更好地保持兼容性,我们应该采用下面这些API来获得操作系统“已知文件夹(Knownfolders)”的正确路径。

  1 C/C++非托管代码: 使用SHGetKnownFolderPath函数,通过指定“已知文件夹”的KNOWNFOLDERID作为参数来获得正确的文件夹路径。

  FOLDERID_ProgramData –所有用户都可以访问的应用程序数据适合放置在这个目录下。
  FOLDERID_LocalAppData – 每个用户单独访问的应用程序数据适合放置在这个目录下。
  FOLDERID_RoamingAppData – 每个用户单独访问的应用程序数据适合放置在这个目录下。 与上面一个目录不同的是,放置在这个目录下的文件会随着用户迁移,当一个用户在同一个域中的其他计算机登录的时候,这些文件会被复制到当前登录的机器上,就像用户随身携带的公文包一样。

下面这段代码演示了在非托管代码中如何调用shell函数,SHGetKnownFolderPath函数获得正确的文件保存路径(SHGetFolderLocation, SHGetFolderPath, SHGetSpecialFolderLocation, SHGetSpecialFolderPath):

#include "shlobj.h"
#include "shlwapi.h"
//… #define AppFolderName _T("YourApp")
#define DataFileName _T("SomeFile.txt") // 构造一个数据文件路径
// dataFilePath指向一个长度为MAX_PATH,类型为TCHAR的字符串数值
// hwndDlg是消息对话框的父窗口句柄
// 当有错误发生的时候用于显示错误提示
// includeFileName用于表示是否在路径后面扩展文件名
BOOL MakeDataFilePath(TCHAR *dataFilePath,
HWND hwndDlg, BOOL includeFileName)
{
// 初始化工作
memset(dataFilePath, 0, MAX_PATH * sizeof(TCHAR));
PWSTR pszPath = NULL; // SHGetKnownFolderPath函数可以返回一个已知文件见的路径,
// 例如我的文档(My Documents),桌面(Desktop),
// 应用程序文件夹(Program Files)等等。
// 对于数据文件来说,FOLDERID_ProgramFiles并不是一个合适的位置
// 使用FOLDERID_ProgramFiles保存所有用户共享的数据文件
// 使用FOLDERID_LocalAppData保存属于每个用户自己的文件(non-roaming).
// 使用FOLDERID_RoamingAppData保存属于每个用户自己的文件(roaming).
// 对于“随身文件”(Roaming files),
// 当一个用户在一个域中的其他计算机登陆的时候,
// 这些文件会被复制到当前登录的机器上,就像用户随身携带的公文包一样 // 获取文件夹路径
if (FAILED(SHGetKnownFolderPath(FOLDERID_ProgramData,
0, NULL, &pszPath)))
// 错误的做法: if (FAILED(SHGetKnownFolderPath(FOLDERID_ProgramFiles,
// 0, NULL, &pszPath)))
{
// 提示错误
MessageBox(hwndDlg, _T("SHGetKnownFolderPath无法获取文件路径"),
_T("Error"), MB_OK | MB_ICONERROR);
return FALSE;
} // 复制路径到目标变量
_tcscpy_s(dataFilePath, MAX_PATH, pszPath);
::CoTaskMemFree(pszPath); //错误的做法: _tcscpy_s(dataFilePath, MAX_PATH, _T("C:\\")); // 在路径后面扩展应用程序所在文件夹
if (!::PathAppend(dataFilePath, AppFolderName))
{
// 提示错误
MessageBox(hwndDlg, _T("PathAppend无法扩展路径"),
_T("Error"), MB_OK | MB_ICONERROR);
return FALSE;
} // 是否添加文件名
if (includeFileName)
{
// 在路径后扩展文件名
if (!::PathAppend(dataFilePath, DataFileName))
{
// 提示错误
MessageBox(hwndDlg, _T("PathAppend无法扩展文件名"),
_T("Error"), MB_OK | MB_ICONERROR);
return FALSE;
}
} return TRUE;
}

2 托管代码: 使用System.Environment.GetFolderPath函数,通过指定我们想要获取的“已知文件夹”为参数,从而获取相应的文件夹的正确路径。

  Environment.SpecialFolder.CommonApplicationData – 所有用户都可以访问的应用程序数据适合放置在这个目录下。
  Environment.SpecialFolder.LocalApplicationData – 每个用户单独访问的应用程序数据适合放置在这个目录下。
  Environment.SpecialFolder.ApplicationData – 每个用户单独访问的应用程序数据适合放置在这个目录下。这是“随身文件夹”。

下面这段代码展示了如何在托管代码中获取正确的文件路径:

internal class FileIO
{
private const string AppFolderName = "YourApp";
private const string DataFileName = "SomeFile.txt";
private static string _dataFilePath; /// <summary>
/// 构建路径
/// </summary>
static FileIO()
{
// Environment.GetFolderPath返回一个“已知文件夹”的路径
// Path.Combine可以合并两个路径成一个合法的路径 // … _dataFilePath = Path.Combine(Environment.GetFolderPath(
Environment.SpecialFolder.ProgramFiles), AppFolderName);
//错误的做法:
//_dataFilePath = Path.Combine(Environment.GetFolderPath(
Environment.SpecialFolder.CommonApplicationData), AppFolderName); // 扩展文件名
_dataFilePath = Path.Combine(_dataFilePath, DataFileName);
} public static void Save(string text)
{
// 检查要保存的字符串是否为空
if (String.IsNullOrEmpty(text))
{
MessageBox.Show("字符串为空,无法保持.", "空字符串",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
} try
{
// 获取文件保存的路径
string dirPath = Path.GetDirectoryName(_dataFilePath);
// 检查文件夹是否存在
if (!Directory.Exists(dirPath))
Directory.CreateDirectory(dirPath); // 创建文件夹
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "文件夹创建失败",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
} try
{
// 保存字符串到文件
StreamWriter sw = new StreamWriter(_dataFilePath);
try
{
sw.Write(text);
}
finally
{
// 关闭文件
sw.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "文件写入失败",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
// …
}
}

如果上面的方法都不适合你,你还可以使用环境变量,使用getenv()或GetEnvironmentVariable()获取相应的文件夹路径:

  %ALLUSERSPROFILE% – 所有用户都可以访问的应用程序数据适合放置在这个目录下。
  %LOCALAPPDATA% – 每个用户单独访问的应用程序数据适合放置在这个目录下。 - (Windows Vista 或者Windows 7)
  %APPDATA% – 每个用户单独访问的应用程序数据适合放置在这个目录下。这是“随身文件夹”。- (Windows Vista 或者Windows 7)

参考:

VC程序获取管理员权限的更多相关文章

  1. golang windows程序获取管理员权限(UAC ) via gocn

    golang windows程序获取管理员权限(UAC ) 在windows上执行有关系统设置命令的时候需要管理员权限才能操作,比如修改网卡的禁用.启用状态.双击执行是不能正确执行命令的,只有右键以管 ...

  2. 【转】vc++MCF/C++/C中怎样让应用程序获得或以管理员权限运行 ,ShellExecuteEX编程 --- 获取管理员权限

    ShellExecuteEX编程 --- 获取管理员权限:http://blog.csdn.net/jhui163/article/details/5873027 怎样让你的应用程序获得管理员权限:就 ...

  3. vs开发 winform 设置winform 获取管理员权限启动

    因为需要设置为开机项 没有管理员权限对注册表访问失败 C# 以管理员身份运行WinForm程序 转载https://www.bbsmax.com/A/obzbkKrQJE/ 鱼洛 2016-07-29 ...

  4. C#以管理员权限运行源码,C#软件获取管理员权限,c#获取管理员权限

    C#以管理员权限运行源码,C#软件获取管理员权限,c#获取管理员权限 发布时间:2014-10-19 21:40内容来源:未知 点击: 次 windows 7和vista提高的系统的安全性,同时需要明 ...

  5. C#程序以管理员权限运行

    原文:C#程序以管理员权限运行 C#程序以管理员权限运行 在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员 ...

  6. 【转】 C#程序以管理员权限运行

    C#程序以管理员权限运行在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无 ...

  7. C# Winform程序请求管理员权限

    如果你的Winform程序需要管理员权限才能正常执行,请加入如下代码: static class Program { /// <summary> /// 应用程序的主入口点. /// &l ...

  8. WIN7操作平台获取管理员权限批处理

    在WIN7操作平台打开某些文件,如果需要管理员权限才能打开.通过下面的操作就可以获取管理员权限 创建批处理register文件.文件内容为,文件后缀名为.reg.然后双击该文件.打开需要访问的文件,如 ...

  9. .net程序和管理员权限的一些事

    1.对某个方法设置管理员权限运行(未考证)(假的,必须以管理员权限启动,不然报错) [PrincipalPermission(SecurityAction.Demand, Role = @" ...

随机推荐

  1. 要想提高PHP的编程效率,你必须知道的要点

    1.当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数.此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储 ...

  2. Highcharts中国地图热力图

    最近有个项目需要将MC销量按大陆各省统计,并以中国地图人力图效果显示.由于项目一直使用Highcharts进行图表的统计,故采用Highmaps来实现. 效果如下: 1)中国各个省.直辖市.自治区: ...

  3. Angular (SPA) WebPack模块化打包、按需加载解决方案完整实现

    文艺小说-?2F,言情小说-?3F,武侠小说-?9F long long ago time-1-1:A 使用工具,long long A ago time-1-2:A 使用分类工具,long long ...

  4. 【干货分享】流程DEMO-资产请购单

    流程名: 资产请购  业务描述: 流程发起时,会检查预算,如果预算不够,流程必须经过总裁审批,如果预算够用,将发起流程,同时占用相应金额的预算,但撤销流程会释放相应金额的预算.  流程相关文件: 流程 ...

  5. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  6. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

  7. Hibernatel框架基础使用

    Hibernatel框架基础使用 1.简介 1.1.Hibernate框架由来 Struts:基于MVC模式的应用层框架技术 Hibernate:基于持久层的框架(数据访问层使用)! Spring:创 ...

  8. .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序

    在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...

  9. 访问IIS网站需要输入用户名密码(非匿名登录)问题汇总

    无语了,最近不少Windows服务器都出现这个访问网站需要输入的问题,而且每次解决方法还不一样...唉,先汇总下解决方法吧,有时间再仔细研究下这些问题是如何导致的. 当IIS已启用"允许匿名 ...

  10. 埃尔米特插值问题——用Python进行数值计算

    当插值的要求涉及到对插值函数导数的要求时,普通插值问题就变为埃尔米特插值问题.拉格朗日插值和牛顿插值的要求较低,只需要插值函数的函数值在插值点与被插函数的值相等,以此来使得在其它非插值节点插值函数的值 ...