一:

编译程序的时候设置一下
在项目属性–连接器–清单文件–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++MCF/C++/C中怎样让应用程序获得或以管理员权限运行 ,ShellExecuteEX编程 — 获取管理员权限
  • VS2010与Win7共舞:UAC与数据重定向
  • CSIDL

VC程序获取管理员权限相关推荐

  1. 使用c++给程序获取管理员权限

    文章目录 背景 修改程序开启时的运行权限 c++获取程序管理员权限 简单配置vs获取程序管理员权限 背景 最近开发的新项目里面的程序,在自己电脑上运行的好好的,打包出去之后,测试多次说程序有问题,打不 ...

  2. golang windows程序获取管理员权限(UAC )

    在windows上执行有关系统设置命令的时候需要管理员权限才能操作,比如修改网卡的禁用.启用状态.双击执行是不能正确执行命令的,只有右键以管理员身份运行才能成功. 为解决此问题,最终找到一个简单的方法 ...

  3. Qt程序获取管理员权限

    QMAKE_LFLAGS += /MANIFESTUAC:"level='requireAdministrator'uiAccess='false'"上面那句死活都不得行,提示路径 ...

  4. win10系统获取管理员权限卸载程序、删除文件等听语音 浏览:9507|更新:2016-02-23 02:27 很多用户升级win10系统以后,发现卸载某些程序或者删除某些文件的时候,会出现权限不够,

    win10系统获取管理员权限卸载程序.删除文件等 听语音 浏览:9507 | 更新:2016-02-23 02:27 很多用户升级win10系统以后,发现卸载某些程序或者删除某些文件的时候,会出现权限 ...

  5. 计算机管理员永久访问权限,win7系统账户怎样永久获取管理员权限?

    win7系统账户怎样永久获取管理员权限? 腾讯视频/爱奇艺/优酷/外卖 充值4折起 win7系统账户怎样永久获取管理员权限? 1.点击开始菜单,在"计算机"上单击右键选择" ...

  6. mac 获取管理员权限

    在某些时候,因为权限不足,导致文件读写失败,这时候一般获取管理员权限就可以了. 1,打开launchpad 2,选择其他程序,打开终端. 3,输入指令 su root,此时系统会提示你输入root密码 ...

  7. c# exe发布后运行获取管理员权限

    ///用于发布后可以运行时获取管理员权限 var wi = WindowsIdentity.GetCurrent();             var wp = new WindowsPrincipa ...

  8. windows中dos命令汇总及获取管理员权限

    文章目录 windows 获取管理员权限的2种方式 runas 用法 windows dos 命令行语法项 windows dos命令总述 windows dos命令详细介绍 - win7及以前: 微 ...

  9. 计算机用户怎么获取管理员权限,window系统管理员权限怎么设置 管理员权限怎么获得...

    经常看到技术博客或论坛上管理员权限,对于电脑老手来说并不复杂,但是小白并不知道什么是管理员权限?怎么知道自己有没有管理员权限,如果没有管理员权限应该如何获取呢?本文就来介绍一下XP和WIN7下管理员权 ...

  10. Linux之获取管理员权限的相关命令

    Linux之获取管理员权限的相关命令 1. sudo命令的使用 命令 说明 sudo -s 切换到root用户,获取管理员权限 sudo 某个命令的执行需要获取管理员权限可以在执行命令前面加上sudo ...

最新文章

  1. 虚幻填坑004:减少starter content占用空间,只保留使用的assets
  2. spring6:bean的生命始末方法
  3. 自学Springboot(一)
  4. 进化计算在深度学习中的应用 | 附多篇论文解读
  5. 最大正方形—leetcode221
  6. ALV打印不显示打印界面的问题
  7. 2018 .NET开发者调查报告: .NET Core 是怎么样的状态
  8. 12-图像梯度-Scharr算子和laplacian算子
  9. poj1511 InvitationCards 最短路 Dijkstra堆优化
  10. if mybatis or test_真赞!IDEA中这么玩MyBatis,让编码速度飞起
  11. USACO Training3.3亚瑟王的宫殿【搜索】By cellur925
  12. 【暴力枚举】LeetCode 90. Subsets II
  13. 程序员面试金典——18.5单词最近的距离
  14. Oracle 修改密码 解锁
  15. 朱松纯:三读《赤壁赋》,从人工智能的角度解读“心”与“理”的平衡
  16. FIT2CLOUD飞致云发布MeterSphere开源持续测试平台
  17. CleanMyMac最新发布的版本是4.10.0
  18. 从产业图谱看中国2020年数据智能行业的发展态势
  19. java计算机毕业设计基于微信小程序的校园外卖订餐系统APP
  20. Python数据分析--统计注册用户

热门文章

  1. If you are using Gradle, make sure that your current variant is debuggable.
  2. 树莓派通过Pin2脚供电的注意事项
  3. [国家集训队]Tree I
  4. 计算机多人远程桌面连接,配置网络:实现多个远程桌面连接
  5. 静态路由配置(目的下一跳)
  6. cad用计算机怎么计算坐标,CAD坐标怎样计算
  7. 相机和镜头选型需要注意哪些问题
  8. 苹果手机图片如何同步鸿蒙,教你如何在两台iPhone之间传照片
  9. Python中切片(Slicing)的运用(:运算符)
  10. 计算机it是什么,IT是什么意思