Конференция "WinAPI" » Windows XP: вызвать диалог "Установка программы от другого имени" [WinXP]
 
  • TIF © (03.09.09 19:01) [0]
    В рамках обратной совместимости с XP нужно запускать свою программу (установки) с правами администратора

    Для этой цели хочу вызывать стандартный диалог. Один из двух, о которых сейчас и пойдёт речь.

    1) "Установка программы от другого имени" - "Install Program As Other User"
    http://pinpic.ru/img/1603/c3aa60ba5d90a6082d3345f8e0747dc1.jpg.html

    По аналогии с вистой додумался переименовать свой в "Setup.exe" или "Install.exe" и добился появления этого диалога. Только вот если будет не "Setup", а "MySetup", трюк не сработает, поэтому этот способ меня не устраивает :(

    Не знаю в какой dll-ке прячется этот диалог и какой функцией его вызвать. В MSDN глухо...

    2) "Запуск от имени другого пользователя" - "Run as"
    Такой диалог, как на этом изображении
    http://pinpic.ru/img/1604/869131253954ec33c2359afae74ab6ca.jpg.html
    вызвать легко:
    ShellExecute(h, PChar('runas'), PChar('c:\1\0.exe'), nil, nil, SW_SHOWNORMAL);
    // h - Дискриптор (handle) окна-владельца диалога
    // Например, Application.Handle
    // Устанавливается в 0 для вызова диалога без привязки к какому-либо окну



    Однако, мне опять-таки хочется большего :) Мне хочется сразу фокусировки на полях ввода имени пользователя и пароля:
    http://pinpic.ru/img/1605/9906c3d97318cd541390f2c4514f9d0d.jpg.html

    Установщик Filezilla, к примеру, как-то это делает... Как?

    PS: как жаль, что ещё требуется поддержка Windows XP :(
    С появлением Vista всё стало проще - добавил правильный манифест и радуйся
    PPS:
    "Чтобы правильно задать вопрос, нужно знать большую часть ответа." © Роберт Шекли. Верный вопрос
    Надеюсь, хоть 51% того, что я уже знаю по сабжу мне удалось высказать :)
    А ссылочку на сайте на этот рассказ неплохо бы поправить или убрать...
  • TIF © (03.09.09 22:12) [1]
    Хм.
    http://xpdll.nirsoft.net/shell32_dll.html

    ID  Dialog Caption
    1007  Run As
    1053  Install Program As Other User



    ID диалога известен. Только непонятно, что с ним делать...
  • brother © (04.09.09 04:48) [2]
    > http://pinpic.ru/img/1605/9906c3d97318cd541390f2c4514f9d0d.jpg.html

    ИМХО, ищем в том окне через апи нужные нам контролы, а потом мышей (виртуально) - клик- клик))))))))))
  • TIF © (04.09.09 15:25) [3]
    > клик- клик

    Жесть :)
    Я лучше уж тогда это в окне установщика напишу "а сейчас берём мышку и щёлкаем вот на эту штуку" :D
  • Leonid Troyanovsky © (04.09.09 17:12) [4]

    > TIF ©   (03.09.09 22:12) [1]

    > ID диалога известен. Только непонятно, что с ним делать.

    Если установщик foreground, then try AttachThreadInput & Windows.SetFocus

    --
    Regards, LVT.
  • TIF © (04.09.09 20:20) [5]
    Без хака не выкрутиться. Печально

    > Установщик Filezilla, к примеру, как-то это делает... Как?

    Лучше бы я не знал, как :) Меньше знаешь, крепче спишь...

    Вышел на установщик NSIS, который используется в FileZilla, потом на UAC-плагин для NSIS:
    http://nsis.sourceforge.net/UAC_plug-in

    В котором в версии
    v0.0.10 - 20080812 (AndersK)
    +Added ugly hook hack to the shells run-as dialog on xp, defaults to other user


    Это и правда ужасный хак %-\
    Основной части мне для шока хватило, а ещё есть и вспомогательная...
    FORCEINLINE LRESULT MySndDlgItemMsg(HWND hDlg,int id,UINT Msg,WPARAM wp=0,LPARAM lp=0) {return SendMessage(GetDlgItem(hDlg,id),Msg,wp,lp);}

    LRESULT CALLBACK MSRunAsDlgMod_ShellProc(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,COUNTOF(buf));
     if (!lstrcmpi(buf,_T("#32770")))
     {
      const UINT IDC_USRSAFER=0x106,IDC_OTHERUSER=0x104,IDC_SYSCRED=0x105;
      GetClassName(GetDlgItem(pCWPS->hwnd,IDC_SYSCRED),buf,COUNTOF(buf));
      if (!lstrcmpi(buf,_T("SysCredential"))) //make sure this is the run as dialog
      {
       MySndDlgItemMsg(pCWPS->hwnd,IDC_USRSAFER,BM_SETCHECK,BST_UNCHECKED);
       MySndDlgItemMsg(pCWPS->hwnd,IDC_OTHERUSER,BM_CLICK);
       
      }

     }
    }
    return CallNextHookEx(g_MSRunAsHook,nCode,wp,lp);
    }



    Нет уж, лучше ограничусь копированием во временную папку под именем Setup.exe и запуском копии. Грязные методы не по мне
 
Конференция "WinAPI" » Windows XP: вызвать диалог "Установка программы от другого имени" [WinXP]
Есть новые Нет новых   [134433   +24][b:0][p:0.001]