-
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.htmlID 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 -
> 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 и запуском копии. Грязные методы не по мне