一个简单的以User权限启动外部应用程序(用NetUserAdd函数和USER_INFO_1结构体动态添加用户,然后用CreateProcessWithLogonW启动程序)

版权声明:本文为博主原创文章,未经博主允许不得转载。

  1. BOOL ExecuteAsUser(LPCWSTR lpszUserName, LPCWSTR lpszPassword, LPCWSTR lpszApplication, LPCWSTR lpszCmdLine)
  2. {
  3. if(NULL == lpszUserName)
  4. {
  5. return FALSE;
  6. }
  7. if(NULL == lpszApplication)
  8. {
  9. return FALSE;
  10. }
  11. BOOL bRet = FALSE;
  12. WCHAR* pUserName = NULL;
  13. WCHAR* pPassword = NULL;
  14. STARTUPINFO si = {sizeof(si)};
  15. PROCESS_INFORMATION pi = {0};
  16. WCHAR szApp[MAX_PATH * 2] = {0};
  17. // Check User Name
  18. size_t nLen = wcslen(lpszUserName) + 1;
  19. pUserName = new WCHAR[nLen];
  20. StringCchPrintfW(pUserName, nLen, L"%s", lpszUserName);
  21. // Check Password
  22. nLen = (NULL != lpszPassword) ? (wcslen(lpszPassword) + 1) : 2;
  23. pPassword = new WCHAR[nLen];
  24. StringCchPrintfW(pPassword, nLen, L"%s", (NULL != lpszPassword) ? lpszPassword : L"");
  25. USER_INFO_1 ui;
  26. DWORD dwError = 0;
  27. DWORD dwLevel = 1;
  28. ui.usri1_name = pUserName;
  29. ui.usri1_password = pPassword;
  30. ui.usri1_priv = USER_PRIV_USER;
  31. ui.usri1_home_dir = NULL;
  32. ui.usri1_comment = NULL;
  33. ui.usri1_flags = UF_SCRIPT;
  34. ui.usri1_script_path = NULL;
  35. // Add User
  36. if(NERR_Success != NetUserAdd(NULL, dwLevel, (LPBYTE)&ui, &dwError))
  37. {
  38. goto _END_;
  39. }
  40. if((NULL != lpszCmdLine) && wcslen(lpszCmdLine))
  41. StringCchPrintfW(szApp, _countof(szApp), L"%s %s", lpszApplication, lpszCmdLine);
  42. else
  43. StringCchPrintfW(szApp, _countof(szApp), L"%s", lpszApplication);
  44. if(CreateProcessWithLogonW(lpszUserName, NULL, lpszPassword, LOGON_WITH_PROFILE, NULL, szApp, 0, NULL, NULL, &si, &pi))
  45. {
  46. bRet = TRUE;
  47. CloseHandle(pi.hThread);
  48. CloseHandle(pi.hProcess);
  49. }
  50. else
  51. {
  52. dwError = GetLastError();
  53. goto _CLEANUP_;
  54. }
  55. bRet = TRUE;
  56. _CLEANUP_:
  57. // Delete User
  58. NetUserDel(NULL, lpszUserName);
  59. _END_:
  60. if(NULL != pPassword)
  61. {
  62. delete[] pPassword;
  63. pPassword = NULL;
  64. }
  65. if(NULL != pUserName)
  66. {
  67. delete[] pUserName;
  68. pUserName = NULL;
  69. }
  70. return bRet;
  71. }
  72. // 测试代码
  73. #include "stdafx.h"
  74. #include <Windows.h>
  75. #include <lm.h>
  76. #include <strsafe.h>
  77. #pragma comment(lib, "Netapi32.lib")
  78. int _tmain(int argc, _TCHAR* argv[])
  79. {
  80. ExecuteAsUser(L"ABC", L"Hello", L"F:\\11.exe", NULL);
  81. return 0;
  82. }
 
 
http://blog.csdn.net/visualeleven/article/details/7640475
这样需要创建新的账户,可用OpenProcessToken+CreateRestrictedToken削去当前进程的令牌的特权用于CreateProcessAsUser
 
 
上一篇:C++学习基础十一——子类对象向父类对象的转化


下一篇:arcgis api 3.x for js 入门开发系列十一地图统计图(附源码下载)