2010-05-18 6 views
1

J'ai une application qui exécute une autre application (la mienne) en utilisant le WinAPI "ShellExecuteEx" avec le verbe "RunAs" de sorte que l'autre application devrait commencer par les informations d'identification "Administrateur".Comment présélectionner l'administrateur lors de l'exécution d'une application utilisant ShellExecuteEx avec le verbe "runas"? (Windows XP)

Mon système d'exploitation est Windows XP. (Ne vous embêtez pas sur les autres systèmes d'exploitation, car j'ai un code spécifique en place)

Le seul problème avec cette chose est que l'utilisateur actuel est présélectionné. Je veux que ce soit "l'utilisateur suivant" avec l'administrateur sélectionné.

Comment faire?

Répondre

0

Il n'y a pas de paramètres documentés ou quelque chose comme ça pour changer les valeurs par défaut dans la boîte de dialogue runes. Si vous êtes prêt à utiliser hacks laid, j'ai un vieux code qui le fait:

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

Je vais vérifier cela –

0

Vous voulez probablement le CreateProcessWithLogonW Function à la place.

+0

Je voudrais que les fenêtres pour inviter une boîte de dialogue pour l'utilisateur d'entrer les informations d'identification plutôt que mon application lui donnant le code. :) –

+0

Eh bien, cela a du sens. Un programme normal ne devrait pas avoir ces choses codées en dur. – Bob77

Questions connexes