zoukankan      html  css  js  c++  java
  • 一个简单的以User权限启动外部应用程序(用NetUserAdd函数和USER_INFO_1结构体动态添加用户,然后用CreateProcessWithLogonW启动程序)good

    [cpp] view plain copy
     
    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.   
    12.     BOOL bRet = FALSE;  
    13.     WCHAR* pUserName = NULL;  
    14.     WCHAR* pPassword = NULL;  
    15.     STARTUPINFO si = {sizeof(si)};  
    16.     PROCESS_INFORMATION pi = {0};  
    17.     WCHAR szApp[MAX_PATH * 2] = {0};  
    18.   
    19.     // Check User Name  
    20.     size_t nLen = wcslen(lpszUserName) + 1;  
    21.     pUserName = new WCHAR[nLen];  
    22.     StringCchPrintfW(pUserName, nLen, L"%s", lpszUserName);  
    23.       
    24.     // Check Password  
    25.     nLen = (NULL != lpszPassword) ? (wcslen(lpszPassword) + 1) : 2;  
    26.     pPassword = new WCHAR[nLen];  
    27.     StringCchPrintfW(pPassword, nLen, L"%s", (NULL != lpszPassword) ? lpszPassword : L"");  
    28.   
    29.     USER_INFO_1 ui;  
    30.     DWORD dwError = 0;  
    31.     DWORD dwLevel = 1;  
    32.     ui.usri1_name = pUserName;  
    33.     ui.usri1_password = pPassword;  
    34.     ui.usri1_priv = USER_PRIV_USER;  
    35.     ui.usri1_home_dir = NULL;  
    36.     ui.usri1_comment = NULL;  
    37.     ui.usri1_flags = UF_SCRIPT;  
    38.     ui.usri1_script_path = NULL;  
    39.     // Add User  
    40.     if(NERR_Success != NetUserAdd(NULL, dwLevel, (LPBYTE)&ui, &dwError))  
    41.     {  
    42.         goto _END_;  
    43.     }  
    44.   
    45.     if((NULL != lpszCmdLine) && wcslen(lpszCmdLine))  
    46.         StringCchPrintfW(szApp, _countof(szApp), L"%s %s", lpszApplication, lpszCmdLine);  
    47.     else  
    48.         StringCchPrintfW(szApp, _countof(szApp), L"%s", lpszApplication);  
    49.   
    50.     if(CreateProcessWithLogonW(lpszUserName, NULL, lpszPassword, LOGON_WITH_PROFILE, NULL, szApp, 0, NULL, NULL, &si, &pi))  
    51.     {  
    52.         bRet = TRUE;  
    53.         CloseHandle(pi.hThread);  
    54.         CloseHandle(pi.hProcess);  
    55.     }  
    56.     else  
    57.     {  
    58.         dwError = GetLastError();  
    59.         goto _CLEANUP_;  
    60.     }  
    61.     bRet = TRUE;  
    62.   
    63. _CLEANUP_:  
    64.     // Delete User  
    65.     NetUserDel(NULL, lpszUserName);  
    66. _END_:  
    67.     if(NULL != pPassword)  
    68.     {  
    69.         delete[] pPassword;  
    70.         pPassword = NULL;  
    71.     }  
    72.     if(NULL != pUserName)  
    73.     {  
    74.         delete[] pUserName;  
    75.         pUserName = NULL;  
    76.     }  
    77.     return bRet;  
    78. }  
    79.   
    80. // 测试代码  
    81. #include "stdafx.h"  
    82.   
    83. #include <Windows.h>  
    84. #include <lm.h>  
    85. #include <strsafe.h>  
    86. #pragma comment(lib, "Netapi32.lib")  
    87.   
    88. int _tmain(int argc, _TCHAR* argv[])  
    89. {  
    90.     ExecuteAsUser(L"ABC", L"Hello", L"F:\11.exe", NULL);  
    91.     return 0;  
    92. }  
     
     
    http://blog.csdn.net/visualeleven/article/details/7640475

     

    这样需要创建新的账户,可用OpenProcessToken+CreateRestrictedToken削去当前进程的令牌的特权用于CreateProcessAsUser
     
     
  • 相关阅读:
    OC的内存管理(二)ARC
    OC中@class的使用
    OC的内存管理(一)
    OC中自定义构造方法
    【数据结构作业—01】用单循环链表解决约瑟夫问题
    TJU Problem 1090 City hall
    GPA
    HDOJ 1061 Rightmost Digit
    TJU Problem 2857 Digit Sorting
    TJU Problem 1015 Gridland
  • 原文地址:https://www.cnblogs.com/findumars/p/6002469.html
Copyright © 2011-2022 走看看