设为首页 收藏本站
查看: 659|回复: 0

VC UAC for win7

[复制链接]

尚未签到

发表于 2015-5-17 11:33:18 | 显示全部楼层 |阅读模式
  
typedef BOOL (CALLBACK * PWTSQueryUserToken)(ULONG SessionId, PHANDLE phToken);
  BOOL DSCreateProcess(DWORD flags, DWORD session, LPCTSTR lpApplicationName, LPTSTR lpCommandLine,
        LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes,
        BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory,
        LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
{
DWORD Error;
DWORD SessId = 0;
BOOL bQueryed = FALSE;
HANDLE hToken = NULL;
PWTSQueryUserToken pWTSQueryUserToken;
FARPROC pQuery = GetProcAddress(GetModuleHandle("Wtsapi32.dll"), "WTSQueryUserToken");
pWTSQueryUserToken = (PWTSQueryUserToken)pQuery;
  if ((flags & CPIF_SESSION) != 0 &&
  bQueryed == FALSE && pWTSQueryUserToken != NULL) {
  bQueryed = pWTSQueryUserToken(session, &hToken);
  //DS_ASSERT(bQueryed != FALSE || ERROR_NO_TOKEN == GetLastError());
  SessId = session;
}
if ((flags & CPIF_SESSION) != 0 && bQueryed == FALSE) {
  Error = GetActiveLogonSession(&SessId, &hToken, session, TRUE);
  bQueryed = (Error == ERROR_SUCCESS);
}
  if (bQueryed == FALSE && (CPIF_FIXEDSESS & flags)) {
  Error = ERROR_TIMEOUT;
  return FALSE;
}
  while (bQueryed == FALSE) {
  Error = GetActiveSession(&SessId);
  if (Error == ERROR_SUCCESS) {
   if (pWTSQueryUserToken != NULL) {
    bQueryed = pWTSQueryUserToken(SessId, &hToken);
    gLogger.info("WTSQueryUserToken: %d %d, hToken %p\n", GetLastError(), bQueryed, hToken);
    break;
   }
   Error = GetActiveLogonSession(&SessId, &hToken, session, TRUE);
   if (Error == ERROR_SUCCESS) {
    /* Only for Windows 2000! */
    bQueryed = TRUE;
    break;
   }
  }
  if (Error != ERROR_NOT_LOGON_PROCESS) {
   /* Terminal Service is not running! */
   //DS_ASSERT(Error == RPC_S_INVALID_BINDING);
   Error = GetActiveLogonSession(&SessId, &hToken, session, FALSE);
   bQueryed = (Error == ERROR_SUCCESS);
   break;
  }
  break;
}
  if (bQueryed == FALSE &&
  ((CPIF_SYSTEM| CPIF_INTERACITVE) & flags) == CPIF_SYSTEM) {
  BOOL created = CreateProcess(lpApplicationName, lpCommandLine,
   lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags,
   lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
  return created;
}
if (bQueryed != FALSE &&
  (CPIF_SYSTEM & flags) == CPIF_SYSTEM) {
  BOOL bSuccess;
  HANDLE hDuplicatedToken = NULL;
  CloseHandle(hToken);
  bSuccess = OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
  if (bSuccess == FALSE) {
   return FALSE;
  }
  bSuccess = DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,
   SecurityIdentification, TokenPrimary, &hDuplicatedToken);
  CloseHandle(hToken);
  if (bSuccess == FALSE) {
   return FALSE;
  }
  hToken = hDuplicatedToken;
  bSuccess = SetTokenInformation(hDuplicatedToken, TokenSessionId, (void*)&SessId, sizeof(SessId));
  if (bSuccess == FALSE) {
   CloseHandle(hToken);
   return FALSE;
  }
}
  #if 0
LUID luid;
TOKEN_PRIVILEGES tp;
if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid) ) {
  tp.PrivilegeCount = 1;
  tp.Privileges[0].Luid = luid;
  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges(hDuplicatedToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, NULL);
}
#endif
if (bQueryed != FALSE) {
  BOOL created = FALSE;
  HANDLE hDuplicatedToken = NULL;
  if (DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL,
   SecurityIdentification, TokenPrimary, &hDuplicatedToken) ) {
   created = CreateProcessAsUser(hDuplicatedToken, lpApplicationName, lpCommandLine,
    lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags,
    lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation);
   gLogger.info("CreateProcessAsUser token %p, error %d, created %d\n", hDuplicatedToken, GetLastError(), created);
   CloseHandle(hDuplicatedToken);
  }
  CloseHandle(hToken);
  return created;
}
  return FALSE;
}
  
  
  以高权限启动新进程

  // 启动Shell
OSVERSIONINFOEX OSVerInfo;
OSVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if(!GetVersionEx((OSVERSIONINFO *)&OSVerInfo))
{
OSVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx((OSVERSIONINFO *)&OSVerInfo);
}
TCHAR atszVerb[16];
if(OSVerInfo.dwMajorVersion >= 6) // Vista 以上
{
_tcscpy(atszVerb,_T("runas"));
}
else
{
_tcscpy(atszVerb,_T(""));
}
USES_CONVERSION;
SHELLEXECUTEINFO se ;
memset(&se,0,sizeof(SHELLEXECUTEINFO));
se.cbSize = sizeof(SHELLEXECUTEINFO);
se.lpVerb = atszVerb;
se.lpFile = W2T(m_bstrShellExe);
se.lpParameters = atszBootCmd;
se.nShow = SW_HIDE ;
se.fMask = SEE_MASK_NOCLOSEPROCESS ;
if(ShellExecuteEx(&se))
{
// 启动成功
}
else
{
// 启动失败,可能UAC没有获得用户许可
}
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-67743-1-1.html 上篇帖子: WindowXP与WIN7环境安装、破解、配置AppScan8.0 下篇帖子: Win7 修改Winlogon.exe进程一个字节禁止Ctrl+Alt+Del、Win+L等任意系统热键
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表