Самоудаление под вистой
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.01.07 12:20
Оценка: 3 (1)
Давным-давно был отработан код деинсталлятора с самоудалением: копируем себя во временный файл, открываем его с FILE_FLAG_DELETE_ON_CLOSE, запускаем через CreateProcess, передавая свой Process Id, ждем, пока он установит флаг, завершаемся, он дожидается нашего завершения, делает все, что нужно, завершается — система его удаляет.

Все отлично работало, начиная с NT4 и кончая 2003. В висте, как водится, работать перестало Никаких ошибок не возникает — файл копии благополучно открывается, но при завершении не удаляется. Такое ощущение, что в висте изменилась логика отметки файла для удаления.

Вопрос: как проще всего поменять алгоритм, чтобы он и работал в любой NT-системе, и не был связан с шаманством типа последовательного запихивания в стек адресов системных функций?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Самоудаление под вистой
От: IID Россия  
Дата: 15.01.07 12:51
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Давным-давно был отработан код деинсталлятора с самоудалением: копируем себя во временный файл, открываем его с FILE_FLAG_DELETE_ON_CLOSE, запускаем через CreateProcess, передавая свой Process Id, ждем, пока он установит флаг, завершаемся, он дожидается нашего завершения, делает все, что нужно, завершается — система его удаляет.


ЕМ>Все отлично работало, начиная с NT4 и кончая 2003. В висте, как водится, работать перестало Никаких ошибок не возникает — файл копии благополучно открывается, но при завершении не удаляется. Такое ощущение, что в висте изменилась логика отметки файла для удаления.


ЕМ>Вопрос: как проще всего поменять алгоритм, чтобы он и работал в любой NT-системе, и не был связан с шаманством типа последовательного запихивания в стек адресов системных функций?


создай BAT файл, который потом сам себя прибъет
kalsarikännit
Re[2]: Самоудаление под вистой
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.01.07 13:33
Оценка:
Здравствуйте, IID, Вы писали:

IID>создай BAT файл, который потом сам себя прибъет


Так я делал под 9x. Под NT получилось более изящно — с DELETE_ON_CLOSE. С bat-файлом много возни, и возникают лишние риски того, что одно не запустится, другое — не завершится...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Самоудаление под вистой
От: IID Россия  
Дата: 15.01.07 13:48
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, IID, Вы писали:


IID>>создай BAT файл, который потом сам себя прибъет


ЕМ>Так я делал под 9x. Под NT получилось более изящно — с DELETE_ON_CLOSE. С bat-файлом много возни, и возникают лишние риски того, что одно не запустится, другое — не завершится...


хз, у меня все прекрасно завершается. Как вариант — подстрахуйся с MoveFileEx, DELAY_UNTIL_REBOOT
kalsarikännit
Re: Самоудаление под вистой
От: TarasCo  
Дата: 15.01.07 13:58
Оценка:
Скорее всего просто нет прав на удаление файла.
Да пребудет с тобою сила
Re[4]: Самоудаление под вистой
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.01.07 14:34
Оценка:
Здравствуйте, IID, Вы писали:

IID>хз, у меня все прекрасно завершается.


У меня (в тестах) — тоже Но надо, чтоб работало везде, у всех юзеров, а практика показывает, что усложнение почти обязательно ведет к росту процента глюков.

IID> Как вариант — подстрахуйся с MoveFileEx, DELAY_UNTIL_REBOOT


Похоже, придется
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Самоудаление под вистой
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.01.07 14:34
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Скорее всего просто нет прав на удаление файла.


Так в этом случае CreateFile возвращала бы ошибку. И в случае, если процесс создать не удается, файл успешно удаляется.

Я все-таки грешу на тонкости поведения висты.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Самоудаление под вистой
От: Аноним  
Дата: 15.01.07 15:51
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, TarasCo, Вы писали:


TC>>Скорее всего просто нет прав на удаление файла.


ЕМ>Так в этом случае CreateFile возвращала бы ошибку. И в случае, если процесс создать не удается, файл успешно удаляется.


ЕМ>Я все-таки грешу на тонкости поведения висты.


А мож виста файл экзешника держит какое-то время в надежде на то что программу опять запустят (или еще там какойто хитрявый механизм) и плюют на влаг DELETE_ON_CLOSE? Мож надо подождать/поработать пол-часика и посмотреть — удаляется он в итоге или нет?
Re[4]: Самоудаление под вистой
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.01.07 16:07
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А мож виста файл экзешника держит какое-то время в надежде на то что программу опять запустят (или еще там какойто хитрявый механизм) и плюют на влаг DELETE_ON_CLOSE? Мож надо подождать/поработать пол-часика и посмотреть — удаляется он в итоге или нет?


Он даже при перезагрузке не удаляется
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Самоудаление под вистой
От: mansur https://netmontools.com
Дата: 16.01.07 06:55
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Он даже при перезагрузке не удаляется


Попробуйте проверить, есть ли у юзера права админа (даже если на 100% уверены что юзер-админ),
может поможет.
С уважением mansur.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Самоудаление под вистой
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 16.01.07 07:06
Оценка:
Здравствуйте, mansur, Вы писали:

M>Попробуйте проверить, есть ли у юзера права админа (даже если на 100% уверены что юзер-админ),


Есть, конечно. Я вообще под нативным админом проверяю.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Самоудаление под вистой
От: mansur https://netmontools.com
Дата: 16.01.07 08:06
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Есть, конечно. Я вообще под нативным админом проверяю.


Я имею ввиду проверить программно, IsUserAdmin(). Я столкнулся с тем, что даже под админом в Viste
только запуск моей программы "Run as administrator" дал нужный результат.

С уважением mansur.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Самоудаление под вистой
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 16.01.07 09:30
Оценка:
Здравствуйте, mansur, Вы писали:

M>Я имею ввиду проверить программно, IsUserAdmin().


А зачем? Для использования FILE_FLAG_DELETE_ON_CLOSE не требуется прав администратора.

M>Я столкнулся с тем, что даже под админом в Viste только запуск моей программы "Run as administrator" дал нужный результат.


"Под админом" — это под родным юзером Administrator (предварительно разблокированным), или под юзером из группы Administrators? Если второе — так и должно быть. Если первое — как запускаете?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: Самоудаление под вистой
От: mansur https://netmontools.com
Дата: 16.01.07 12:43
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>А зачем? Для использования FILE_FLAG_DELETE_ON_CLOSE не требуется прав администратора.


Кто знает, может и требуются, я всего лишь предлагаю попробовать...

ЕМ>"Под админом" — это под родным юзером Administrator (предварительно разблокированным), или под юзером из группы Administrators? Если второе — так и должно быть. Если первое — как запускаете?


Особо не заморачивался этим вопросом, кажется под логином, которым устанавливал Висту.
Тоже свой простенький инсталлятор, и без функции IsUserAdmin() нето что файл не удалялся, даже иконка на
десктопе не прорисовалась как нужно.
И еще заметил багофичу — чекбокс со стилем BS_PUSHLIKE("button") при включенных темах показывется инверсно — нажатый закрашивается и наоборот,
причём с кнопками и стандартными чекбоксами всё в порядке. Пока до лучших времен инвертировал реакцию на нажатие чекбокса, осталось как-то отловить включение темы.
С уважением mansur.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: Самоудаление под вистой
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 16.01.07 12:53
Оценка:
Здравствуйте, mansur, Вы писали:

ЕМ>>"Под админом" — это под родным юзером Administrator (предварительно разблокированным), или под юзером из группы Administrators?


M>Особо не заморачивался этим вопросом, кажется под логином, которым устанавливал Висту.


Во, а надо было бы заморочиться Ибо те аккаунты, который виста предлагает создать в конце установки — это обычные юзеры, включенные в группу администраторов. У них по умолчанию права далеко не полные, в тех случаях, когда виста сама догадывается, что прав может не хватить — она спрашивает. Но для своего инсталлятора она не догадается. А администраторский аккаунт нужно разблокировать, чтобы он стал доступен для логина.

M>Тоже свой простенький инсталлятор, и без функции IsUserAdmin() нето что файл не удалялся, даже иконка на десктопе не прорисовалась как нужно.


IsUserAnAdmin, по документации, говорит только о том, что пользователь включен в группу администраторов.

M>И еще заметил багофичу — чекбокс со стилем BS_PUSHLIKE("button") при включенных темах показывется инверсно — нажатый закрашивается и наоборот,


RTM или RC?

Можно багрепорт написать
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: Самоудаление под вистой
От: mansur https://netmontools.com
Дата: 16.01.07 13:21
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>IsUserAnAdmin, по документации, говорит только о том, что пользователь включен в группу администраторов.


Прошу прощения, IsUserAdmin() Игоря Вартанова отсюда: http://rsdn.ru/article/qna/baseserv/isusradm.xml
В своей утилите http://lookanet.com/download/lookanet.exe я использую IsUserAdmin() для включения некоторых фич,
а в Висте пришлось использовать и в инсталляторе.

ЕМ>RTM или RC?

Windows 6.0 build 6000.

ЕМ>Можно багрепорт написать

А можно сие делегировать вам?
Суважением mansur.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[12]: Самоудаление под вистой
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 16.01.07 13:31
Оценка:
Здравствуйте, mansur, Вы писали:

M>IsUserAdmin() Игоря Вартанова отсюда


А, понял.

ЕМ>>Можно багрепорт написать


M>А можно сие делегировать вам?


Как MS обработает мой заказ на подписку MSDN — так пожалуйста Буду, типа, легальный девелопер
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[13]: Самоудаление под вистой
От: mansur https://netmontools.com
Дата: 16.01.07 13:38
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Как MS обработает мой заказ на подписку MSDN — так пожалуйста Буду, типа, легальный девелопер


Поздравляю!
С уважением mansur.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[14]: Самоудаление под вистой
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 16.01.07 13:49
Оценка:
Здравствуйте, mansur, Вы писали:

ЕМ>>Как MS обработает мой заказ на подписку MSDN — так пожалуйста Буду, типа, легальный девелопер


M>Поздравляю!


Спасибо, но пока поздравлять не с чем — они уже почти месяц тормозят.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Самоудаление под вистой
От: walky  
Дата: 16.01.07 15:17
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:


Все попроще будет. Один из способов:


#include <windows.h>
#include <stdio.h>

#pragma comment(lib,"shell32.lib")

BOOL SelfDelete()
{
  TCHAR szFile[MAX_PATH], szCmd[MAX_PATH];

  if((GetModuleFileName(0,szFile,MAX_PATH)!=0) && (GetShortPathName(szFile,szFile,MAX_PATH)!=0))
  {
    lstrcpy(szCmd,"/c del ");
    lstrcat(szCmd,szFile);
    lstrcat(szCmd," >> NUL");

    if((GetEnvironmentVariable("ComSpec",szFile,MAX_PATH)!=0) &&
       ((INT)ShellExecute(0,0,szFile,szCmd,0,SW_HIDE)>32))
       return TRUE;
  }
  return FALSE;
}

int main(int argc,char* argv[])
{
    printf("Name: %s\n",argv[0]);
    SelfDelete(); // Очень важно!! SelfDelete() должно выполнятся как можно ближе к завершению программы.
    return 0;
}



А вообще вам сюда.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.