Как предварительно выбрать Администратор при запуске приложения, используя ShellExecuteEx с глаголом "runas"? (Windows XP) - PullRequest
1 голос
/ 18 мая 2010

У меня есть приложение, которое запускает другое (мое) приложение, использующее WinAPI «ShellExecuteEx» с глаголом «RunAs», так что другое приложение должно запускаться с учетными данными «Administrator».

Моя ОС - Windows XP. (Не беспокойтесь о другой операционной системе, так как у меня есть определенный код на месте)

Единственная проблема, связанная с этим, заключается в том, что «Текущий пользователь» выбирается заранее. Я хочу, чтобы это был "Следующий пользователь" с выбранным администратором.

Как это сделать?

Ответы [ 2 ]

0 голосов
/ 19 мая 2010

Возможно, вам нужна вместо CreateProcessWithLogonW функция .

0 голосов
/ 18 мая 2010

Нет задокументированных настроек или чего-либо подобного, чтобы изменить настройки по умолчанию в диалоге 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);
...