您的位置:首页 > 其它

一个简单的以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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: