2010-05-18 119 views
1

我有一个应用程序使用带有动词“RunAs”的WinAPI“ShellExecuteEx”运行另一个应用程序(我的),以便其他应用程序应以“Administrator”凭据开头。如何使用带有动词“runas”的ShellExecuteEx运行应用程序时预先选择管理员? (Windows XP)

我的操作系统是Windows XP。 (不要打扰其他操作系统,因为我有特定的代码)

这个事情唯一的问题是,“当前用户”预先选定。我希望它是管理员选中的“关注用户”。

如何做到这一点?

回答

0

没有文档设置或类似的东西来改变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); 
+0

我会检查一下 – 2010-05-20 05:43:51

0

你可能想的CreateProcessWithLogonW Function代替。

+0

我希望窗口提示用户输入凭证的对话框,而不是通过代码输入我的应用程序。 :) – 2010-05-20 05:43:15

+0

那是有道理的。预计一个正常的程序不会被硬编码。 – Bob77 2010-05-20 12:50:33

相关问题