win7的管理员问题,实在是恶心,下面总结了WIN7下以管理员运行的方式:
A、 每次用户都右键菜单使用管理员权限运行程序,行情客户端就没有问题
原因:不用解释了吧!呵呵。
B、 客户端不要安装在系统盘Program Files下
原因:这样就可以避免只有管理员权限才可以写入文件的问题
C、 修改客户端,迁移程序数据
原因:这样就可以避免只有管理员权限才可以写入文件的问题
D、 修改客户端,编译成使用admin权限运行
原因:编译器链接有调用者选项 (asInvoker、highestAvailable、requireAdministrator),这里可以选择requireAdministrator
E、 修改注册表:
原因:在(HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers下新建一个键 键名为主程序全路径,值为RUNASADMIN
F、 默认从update启动Main.exe
原因:因为VISTA以后的WINDOWS会根据程序的文件名判断是不是需要管理员权限去运行,比如带有updae和install之类的名称的话,WINDOWS会自动认为需要管理员权限运行,这样通过update之类的文件启动主程序的话,主程序就会拥有管理员权限了。
G、主程序自己启动自己
原因:主程序可以先以普通权限运行,然后通过在启动自己,这时要求管理员权限运行,然后退出前面普通权限运行的程序。这个在开机自动启动是很好的解决方案。例如:
if ((!lpstrCmdLine || !lpstrCmdLine[0]) && UI::GetOSVertion().dwMajorVersion >= 6) {
//VISTA WIN7 需要使用管理员权限
TCHAR szPath[MAX_PATH] = {0};
::GetModuleFileName(NULL, szPath, MAX_PATH);
TCHAR szWorkDirectory[MAX_PATH];
StrCpy(szWorkDirectory, szPath);
PathRemoveFileSpec(szWorkDirectory);
SHELLEXECUTEINFO SEE = {0};
SEE.cbSize = sizeof(SHELLEXECUTEINFO);
SEE.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
SEE.lpFile = szPath;
SEE.lpVerb = TEXT("runas");
SEE.lpDirectory = szWorkDirectory;
SEE.lpParameters = TEXT("-uac");
ShellExecuteEx(&SEE);
bRunNormal = FALSE;
} else if (!_tcsicmp(lpstrCmdLine, _T("-update"))) {//
nRet = Update(lpstrCmdLine, nCmdShow);
bRunNormal = FALSE;
} else if (!_tcsicmp(lpstrCmdLine, _T("-uac"))) {//
//vista and win7 ranas admin mode.
//ran as admin normal bRunNormal = TRUE
}