一个简单的以User权限启动外部应用程序
2015-09-29 21:59
447 查看
BOOL ExecuteAsUser(LPCWSTR lpszUserName, LPCWSTR lpszPassword, LPCWSTR lpszApplication, LPCWSTR lpszCmdLine) { if(NULL == lpszUserName) { return FALSE; } if(NULL == lpszApplication) { return FALSE; } BOOL bRet = FALSE; WCHAR* pUserName = NULL; WCHAR* pPassword = NULL; STARTUPINFO si = {sizeof(si)}; PROCESS_INFORMATION pi = {0}; WCHAR szApp[MAX_PATH * 2] = {0}; // Check User Name size_t nLen = wcslen(lpszUserName) + 1; pUserName = new WCHAR[nLen]; StringCchPrintfW(pUserName, nLen, L"%s", lpszUserName); // Check Password nLen = (NULL != lpszPassword) ? (wcslen(lpszPassword) + 1) : 2; pPassword = new WCHAR[nLen]; StringCchPrintfW(pPassword, nLen, L"%s", (NULL != lpszPassword) ? lpszPassword : L""); USER_INFO_1 ui; DWORD dwError = 0; DWORD dwLevel = 1; ui.usri1_name = pUserName; ui.usri1_password = pPassword; ui.usri1_priv = USER_PRIV_USER; ui.usri1_home_dir = NULL; ui.usri1_comment = NULL; ui.usri1_flags = UF_SCRIPT; ui.usri1_script_path = NULL; // Add User if(NERR_Success != NetUserAdd(NULL, dwLevel, (LPBYTE)&ui, &dwError)) { goto _END_; } if((NULL != lpszCmdLine) && wcslen(lpszCmdLine)) StringCchPrintfW(szApp, _countof(szApp), L"%s %s", lpszApplication, lpszCmdLine); else StringCchPrintfW(szApp, _countof(szApp), L"%s", lpszApplication); if(CreateProcessWithLogonW(lpszUserName, NULL, lpszPassword, LOGON_WITH_PROFILE, NULL, szApp, 0, NULL, NULL, &si, &pi)) { bRet = TRUE; CloseHandle(pi.hThread); CloseHandle(pi.hProcess); } else { dwError = GetLastError(); goto _CLEANUP_; } bRet = TRUE; _CLEANUP_: // Delete User NetUserDel(NULL, lpszUserName); _END_: if(NULL != pPassword) { delete[] pPassword; pPassword = NULL; } if(NULL != pUserName) { delete[] pUserName; pUserName = NULL; } return bRet; } // 测试代码 #include "stdafx.h" #include <Windows.h> #include <lm.h> #include <strsafe.h> #pragma comment(lib, "Netapi32.lib") int _tmain(int argc, _TCHAR* argv[]) { ExecuteAsUser(L"ABC", L"Hello", L"F:\\11.exe", NULL); return 0; }
参考:http://blog.csdn.net/visualeleven/article/details/7640475
相关文章推荐
- Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 【转】
- Unity3D之碰撞体,刚体
- java篇 【2】java编程的两种类型 与hellword程序
- 复用类: 组合、继承和代理
- Robot Framework(基础知识)
- 街区最短路径问题
- Android Studio快捷键
- JAVA字符串的方法
- netbeans ide8 如何修改为英文版
- 二维数组求鞍点 ---- 2015/9/29
- 题目3 : Fibonacci
- 剑指offer-反转链表
- 行编辑器之堆栈法
- 【转】 Spinner的常用技巧
- 题目1 : Farthest Point
- 空指针异常错误集
- TI ZigBee FAQ 常见问题解答
- 磁盘IO单线程顺序写时最快的,如果多线程写,磁盘的磁头要不断重新寻址,所以写入速度反而会慢
- Linux内存管理 【转】
- 如何正确学习JavaScript