一个简单的以User权限启动外部应用程序
2012-06-07 07:46
429 查看
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; }
相关文章推荐
- 一个简单的以User权限启动外部应用程序(用NetUserAdd函数和USER_INFO_1结构体动态添加用户,然后用CreateProcessWithLogonW启动程序)good
- 一个简单的以User权限启动外部应用程序
- 一个简单的以User权限启动外部应用程序
- JS启动应用程序的一个简单例子
- JS启动应用程序的一个简单例子
- 在window系统(xp,vista,win7)中,如何以system权限启动应用程序?
- 转:解决VC2005程序的一个运行错误“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”
- C#启动一个外部程序(2)-ShellExecute
- 建立一个最简单的Webwork应用程序
- 构建一个简单的ios应用程序
- 启动另外的一个应用程序的Activity(三种方式)
- 如何做一个处理命令行的应用程序,请大家帮我做一个简单的,说明一下,我想弄清其中 的原理!
- android build 过程 (ramdisk.img、sytem.img、userdata.img)和 启动过程简单分析
- 在VS2003中无法在Web服务器上启动调试。您不具备调试此应用程序的权限,此项目的URL位于Internet区域
- android build 过程 (ramdisk.img、sytem.img、userdata.img)和 启动过程简单分析
- VC中如何让一个应用程序只启动一次
- 在一个应用程序中启动另外一个已经安装的应用程序或系统程序
- 启动另外的一个应用程序的Activity(三种方式)
- 创建一个简单的Linq数据库应用程序
- 无法在Web服务器上启动调试。您不具备调试此应用程序的权限,此项目的URL位于Internet区域。