100分求解VC中如何以不同于当前账户来调用外部程序

比如我的计算机有1,2两个账户,现在使用账户1,VC要调用一个程序,现在我想让VC以账户2的方式来运行这个程序,该如何实现小弟不胜感激解答人2L,已经仔细看过资料,没有发... 比如我的计算机有1,2两个账户,现在使用账户1,VC要调用一个程序,现在我想让VC以账户2的方式来运行这个程序,该如何实现
小弟不胜感激解答人
2L,已经仔细看过资料,没有发现与账户有关的参数
可否举一个具体的例子,不胜感激
3L,这个问题与账户是否处于活动状态没有关系,因为我现在可以可以用手动的方式去让一个程序在当前用户为管理员的状态下,以不同账户去运行,我想问的是这一切用程序如何实现。
展开
 我来答
silvergingko
2010-07-19 · TA获得超过5945个赞
知道小有建树答主
回答量:688
采纳率:0%
帮助的人:875万
展开全部
我贴了下代码,楼主看下。当然,程序可能会失败,譬如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。
enochwills
2010-07-17 · TA获得超过4793个赞
知道大有可为答主
回答量:2031
采纳率:96%
帮助的人:1659万
展开全部
用CreateProcess,可以让进程(就是你说的那个程序)以不同账号运行。
具体请看下面的参考资料:

http://baike.baidu.com/view/697167.htm?fr=ala0_1_1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
niinor
2010-07-19 · TA获得超过2246个赞
知道小有建树答主
回答量:2047
采纳率:0%
帮助的人:1366万
展开全部
当你的计算机能够两个账户同时处于活动状态时再考虑这个问题吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liuhua1433
2010-07-24 · TA获得超过173个赞
知道答主
回答量:79
采纳率:0%
帮助的人:49.2万
展开全部
#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就不必要加最前面那两行。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式