我有一个应用程序使用带有动词“RunAs”的WinAPI“ShellExecuteEx”运行另一个应用程序(我的),以便其他应用程序应以“Administrator”凭据开头。如何使用带有动词“runas”的ShellExecuteEx运行应用程序时预先选择管理员? (Windows XP)
我的操作系统是Windows XP。 (不要打扰其他操作系统,因为我有特定的代码)
这个事情唯一的问题是,“当前用户”预先选定。我希望它是管理员选中的“关注用户”。
如何做到这一点?
我有一个应用程序使用带有动词“RunAs”的WinAPI“ShellExecuteEx”运行另一个应用程序(我的),以便其他应用程序应以“Administrator”凭据开头。如何使用带有动词“runas”的ShellExecuteEx运行应用程序时预先选择管理员? (Windows XP)
我的操作系统是Windows XP。 (不要打扰其他操作系统,因为我有特定的代码)
这个事情唯一的问题是,“当前用户”预先选定。我希望它是管理员选中的“关注用户”。
如何做到这一点?
没有文档设置或类似的东西来改变runas对话框中的默认设置。如果你愿意用丑陋的黑客,我有一些旧的代码,做的:
HHOOK g_MSRunAsHook;
...
LRESULT SndDlgItemMsg(HWND hDlg,int id,UINT Msg,WPARAM wp=0,LPARAM lp=0) {return SendMessage(GetDlgItem(hDlg,id),Msg,wp,lp);}
LRESULT CALLBACK MSRunAsDlgModProc(int nCode,WPARAM wp,LPARAM lp)
{
CWPRETSTRUCT*pCWPS;
if (nCode >= 0 && (pCWPS=(CWPRETSTRUCT*)lp) && WM_INITDIALOG==pCWPS->message)
{
TCHAR buf[30];
GetClassName(pCWPS->hwnd,buf,ARRAYSIZE(buf));
if (!lstrcmpi(buf,_T("#32770")))
{
GetClassName(GetDlgItem(pCWPS->hwnd,0x105),buf,ARRAYSIZE(buf));
if (!lstrcmpi(buf,_T("SysCredential"))) //is this the correct dialog?
{
SndDlgItemMsg(pCWPS->hwnd,0x106,BM_SETCHECK,BST_UNCHECKED);//optional
SndDlgItemMsg(pCWPS->hwnd,0x104,BM_CLICK);
SndDlgItemMsg(GetDlgItem(pCWPS->hwnd,0x105),0x3EB,WM_SETTEXT,0,(LPARAM)"Admin name");
SndDlgItemMsg(GetDlgItem(pCWPS->hwnd,0x105),0x3ED,WM_SETTEXT,0,(LPARAM)"Admin pwd");
}
}
}
return CallNextHookEx(g_MSRunAsHook,nCode,wp,lp);
}
...
g_MSRunAsHook=NULL;
if(GetOSVerMajor()==5 && GetOSVerMinor()>=1) //only XP/2003 (you must implement GetOSVer* on your own)
{
g_MSRunAsHook=SetWindowsHookEx(WH_CALLWNDPROCRET,MSRunAsDlgModProc,0,GetCurrentThreadId());
}
ShellExecuteEx(&sei);
if (g_MSRunAsHook)UnhookWindowsHookEx(g_MSRunAsHook);
你可能想的CreateProcessWithLogonW Function代替。
我希望窗口提示用户输入凭证的对话框,而不是通过代码输入我的应用程序。 :) – 2010-05-20 05:43:15
那是有道理的。预计一个正常的程序不会被硬编码。 – Bob77 2010-05-20 12:50:33
我会检查一下 – 2010-05-20 05:43:51