100分求解VC中如何以不同于当前账户来调用外部程序
比如我的计算机有1,2两个账户,现在使用账户1,VC要调用一个程序,现在我想让VC以账户2的方式来运行这个程序,该如何实现小弟不胜感激解答人2L,已经仔细看过资料,没有发...
比如我的计算机有1,2两个账户,现在使用账户1,VC要调用一个程序,现在我想让VC以账户2的方式来运行这个程序,该如何实现
小弟不胜感激解答人
2L,已经仔细看过资料,没有发现与账户有关的参数
可否举一个具体的例子,不胜感激
3L,这个问题与账户是否处于活动状态没有关系,因为我现在可以可以用手动的方式去让一个程序在当前用户为管理员的状态下,以不同账户去运行,我想问的是这一切用程序如何实现。 展开
小弟不胜感激解答人
2L,已经仔细看过资料,没有发现与账户有关的参数
可否举一个具体的例子,不胜感激
3L,这个问题与账户是否处于活动状态没有关系,因为我现在可以可以用手动的方式去让一个程序在当前用户为管理员的状态下,以不同账户去运行,我想问的是这一切用程序如何实现。 展开
4个回答
展开全部
我贴了下代码,楼主看下。当然,程序可能会失败,譬如Vista+的操作系统在安全权限方面需要用户进行一些干预,以及当前用户是否是管理员身份的账户等因素。在这里我使用了API CreateProcessWithLogonW;还有其他一些函数如CreateProcessAsUser,CreateProcessWithTokenW。
代码如下:
//CreateProcessAsNewUser.cpp
PCWSTR pUser = L"myAccountName";
PCWSTR pDomain = L".";
PCWSTR pPassword = L"myAccountPassword";
WCHAR aExePath[] = { L"x:\\myTestProgram.exe" };
STARTUPINFO startupInfo = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION procInfo;
if (CreateProcessWithLogonW(pUser, pDomain, pPassword, LOGON_WITH_PROFILE, NULL,
aExePath, 0, NULL, NULL, &startupInfo, &procInfo))
{
CloseHandle(procInfo.hThread);
CloseHandle(procInfo.hProcess);
_tprintf(_T("Succeeded to create new process\r\n"));
}
else
{
_tprintf(_T("Failed to create new prcoess(#error%d)\r\n"), GetLastError());
}
//ShowCurrentUser.cpp
#include <lmcons.h>//For the use of macro -- UNLEN
TCHAR aUser[UNLEN + 1] = { 0 };
DWORD dwSize = _countof(aUser);
GetUserName(aUser, &dwSize);
//Show the content of char array of aUser to confirm the user name
需要注意的是,CreateProcessWithLogonW在VS2005及以前的版本没有收录该API,默认在VS2008的版本中有提供,CreateProcessWithTokenW适用于Vista及以后的操作系统,调用CreateProcessAsUser 这个API的进程需要先将进程提权,然后才能调用该函数,否则会失败。提权方法可以找下关键字:OpenProcessToken,TOKEN_PRIVILEGES,LookupPrivilegeValue和AdjustTokenPrivileges。
代码如下:
//CreateProcessAsNewUser.cpp
PCWSTR pUser = L"myAccountName";
PCWSTR pDomain = L".";
PCWSTR pPassword = L"myAccountPassword";
WCHAR aExePath[] = { L"x:\\myTestProgram.exe" };
STARTUPINFO startupInfo = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION procInfo;
if (CreateProcessWithLogonW(pUser, pDomain, pPassword, LOGON_WITH_PROFILE, NULL,
aExePath, 0, NULL, NULL, &startupInfo, &procInfo))
{
CloseHandle(procInfo.hThread);
CloseHandle(procInfo.hProcess);
_tprintf(_T("Succeeded to create new process\r\n"));
}
else
{
_tprintf(_T("Failed to create new prcoess(#error%d)\r\n"), GetLastError());
}
//ShowCurrentUser.cpp
#include <lmcons.h>//For the use of macro -- UNLEN
TCHAR aUser[UNLEN + 1] = { 0 };
DWORD dwSize = _countof(aUser);
GetUserName(aUser, &dwSize);
//Show the content of char array of aUser to confirm the user name
需要注意的是,CreateProcessWithLogonW在VS2005及以前的版本没有收录该API,默认在VS2008的版本中有提供,CreateProcessWithTokenW适用于Vista及以后的操作系统,调用CreateProcessAsUser 这个API的进程需要先将进程提权,然后才能调用该函数,否则会失败。提权方法可以找下关键字:OpenProcessToken,TOKEN_PRIVILEGES,LookupPrivilegeValue和AdjustTokenPrivileges。
展开全部
用CreateProcess,可以让进程(就是你说的那个程序)以不同账号运行。
具体请看下面的参考资料:
http://baike.baidu.com/view/697167.htm?fr=ala0_1_1
具体请看下面的参考资料:
http://baike.baidu.com/view/697167.htm?fr=ala0_1_1
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
当你的计算机能够两个账户同时处于活动状态时再考虑这个问题吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#pragma comment(lib,"Advapi32.lib")
WINADVAPI BOOL WINAPI CreateProcessWithLogonW(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPCWSTR,LPWSTR,DWORD,LPVOID,LPCWSTR,LPSTARTUPINFOW,LPPROCESS_INFORMATION);
void OtherUser()
{
CString user=_T("test"); //用户名:test
CString pwd=_T("123456"); //密码:123456
CString cmd=_T("c:\\windows\\system32\\calc.exe"); //命令行(启动一个计算器)
STARTUPINFO si={};
si.cb=sizeof(si);
PROCESS_INFORMATION pi;
::CreateProcessWithLogonW(user,0,pwd,0,0,cmd.GetBuffer(),0,0,0,&si,&pi);
}
如果是VC2008就不必要加最前面那两行。
WINADVAPI BOOL WINAPI CreateProcessWithLogonW(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPCWSTR,LPWSTR,DWORD,LPVOID,LPCWSTR,LPSTARTUPINFOW,LPPROCESS_INFORMATION);
void OtherUser()
{
CString user=_T("test"); //用户名:test
CString pwd=_T("123456"); //密码:123456
CString cmd=_T("c:\\windows\\system32\\calc.exe"); //命令行(启动一个计算器)
STARTUPINFO si={};
si.cb=sizeof(si);
PROCESS_INFORMATION pi;
::CreateProcessWithLogonW(user,0,pwd,0,0,cmd.GetBuffer(),0,0,0,&si,&pi);
}
如果是VC2008就不必要加最前面那两行。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询