Перейти к содержанию

Срабатывание антивирусов на механизм обновления проекта


Рекомендуемые сообщения

Доброго времени суток!
У меня появилась такая проблема:
Сделал в проекте механизм самообновления через загрузчик программы. То есть запускается RegistratorLoader.exe, который проверяет наличие обновлений и запускает потом RegistratorFOG.exe - основную программу. Так вот антивирусы на машинах клиентов (в частности Аваст, Касперский, Nod, AVG) завопили, что RegistratorLoader.exe - это вирус HEUR:Trojan-Downloader.Win32.Generic (по Касперскому)
Подскажите, пожалуйста, как можно попробовать изменить код, чтобы антивирусы перестали ругаться? С проблемами подобного типа никогда не разбирался, видимо поэтому даже не знаю в какую сторону думать...
Среда Delphi XE7
Код:

program RegistratorLoader;


uses

WinInet, shellapi, windows, sysutils;



function AppVersion: string;

var

dwHandle: THandle;

dwSize: DWORD;

lpData, lpData2: Pointer;

uiSize: UINT;

begin

Result:= '';

dwSize:= GetFileVersionInfoSize(PChar('RegistratorFOG.exe'), dwSize);

dwHandle:= 0;

if dwSize <> 0 then

begin

GetMem(lpData, dwSize);

if GetFileVersionInfo(PChar('RegistratorFOG.exe'), dwHandle, dwSize, lpData)

then

begin

uiSize:= Sizeof(TVSFixedFileInfo);

VerQueryValue(lpData, '\', lpData2, uiSize);

with PVSFixedFileInfo(lpData2)^ do

Result:= Format('%d.%02d.%02d.%02d', [HiWord(dwFileVersionMS),

LoWord(dwFileVersionMS), HiWord(dwFileVersionLS),

LoWord(dwFileVersionLS)]);

end;

FreeMem(lpData, dwSize);

end;

end;



function GetInetFile(const fileURL, FileName: String): boolean;

const

BufferSize = 1024;

var

hSession, hURL: HInternet;

Buffer: array [1 .. BufferSize] of Byte;

BufferLen: DWORD;

f: File;

sAppName: string;

function ExtractFileName(const FileName: string): string;

var

I: Integer;

begin

for I:= High(FileName) downto Low(FileName) do

if FileName[I] = '\' then

break;

Result:= Copy(FileName, I + 1, length(FileName) - I);

end;



begin

Result:= False;

sAppName:= ExtractFileName(paramstr(0));

hSession:= InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,

nil, nil, 0);

try

hURL:= InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);

try

AssignFile(f, FileName);

Rewrite(f, 1);

repeat

InternetReadFile(hURL, @Buffer, Sizeof(Buffer), BufferLen);

BlockWrite(f, Buffer, BufferLen)

until BufferLen = 0;

CloseFile(f);

Result:= True;

finally

InternetCloseHandle(hURL)

end

finally

InternetCloseHandle(hSession)

end

end;



var

NewVer, isCritical, message_: string;

T: Text;

AcceptUpd: Integer;

uTyp: Cardinal;

fl: boolean;



begin

GetInetFile('https://dl.dropboxusercontent.com/###/version', 'version');

AssignFile(T, 'version');

ReSet(T);

ReadLn(T, NewVer);

ReadLn(T, isCritical);

CloseFile(T);

deletefile('version');

fl:= False;

if NewVer <> AppVersion then

begin

if isCritical = 'Critical' then

begin

uTyp:= MB_ICONWARNING + MB_YESNO;

message_:= 'Доступно критическое обновление программы. Обновить?';

fl:= True;

end

else

begin

uTyp:= MB_ICONQUESTION + MB_YESNO;

message_:= 'Доступно обновление программы. Обновить?';

fl:= True;

end;

if fl then

if messagebox(0, PChar(message_), PChar('Обновление RegistratorFOG'),

uTyp) = idYes then

begin

if GetInetFile

('https://dl.dropboxusercontent.com/###/RegistratorFOG.exe',

'RegistratorFOG.new') then

begin

deletefile('RegistratorFOG.exe');

RenameFile('RegistratorFOG.new', 'RegistratorFOG.exe');

end;

end;

end;

ShellExecute(0, 'open', 'RegistratorFOG.exe', nil, nil, 1);



end.

 

 

 

Ссылка на комментарий
Поделиться на другие сайты

Скорее всего, такой механизм обновления, когда сначала запускается одна программа, что то скачивает, запускает вторую является подозрительным. 

Посмотрите, как сделано в других решениях и сделайте аналогично. Как вариант - отправить программу в ЛК, что бы там убрали детект на неё.

Ссылка на комментарий
Поделиться на другие сайты

Скорее всего, такой механизм обновления, когда сначала запускается одна программа, что то скачивает, запускает вторую является подозрительным. 

Посмотрите, как сделано в других решениях и сделайте аналогично. Как вариант - отправить программу в ЛК, что бы там убрали детект на неё.

Понимаю, конечно же, что код можно как-то "перестроить", чтобы не срабатывало. А вот как реализовано в других решениях? Пробовал и "всё в одном" - тот же эффект. Как сделано в других решениях? Если брать уже готовые продукты - код все равно от пользователя скрыт, а решений в интернете не нашел, которые бы так же, как, например, обновление браузера, Team-viewer'a или флэш-плеера, срабатывали хорошо и без "алертов".

Ссылка на комментарий
Поделиться на другие сайты

Выкладывайте на сервере помимо обновленного приложения текстовый файл с его md5. При проверке обновлений выкачивайте md5 и сравнивайте с файлом на компьютере. Если такой алгоритм?

Ссылка на комментарий
Поделиться на другие сайты

Выкладывайте на сервере помимо обновленного приложения текстовый файл с его md5. При проверке обновлений выкачивайте md5 и сравнивайте с файлом на компьютере. Если такой алгоритм?

Уточню описание работы моего механизма обновления (хотя по коду в принципе видно). Скачивается файл с информацией о версии, и если она различается с текущей - программа обновляет основной .exe. Если я вместо скачки файла version буду скачивать файл, содержащий контрольную сумму и ее сравнивать - что изменится? Не понимаю, что от этого изменится, но.... попробую

Ссылка на комментарий
Поделиться на другие сайты

 

 


Подскажите, пожалуйста, как можно попробовать изменить код, чтобы антивирусы перестали ругаться?
настроить исключения в антивирусах
Ссылка на комментарий
Поделиться на другие сайты

Уточню описание работы моего механизма обновления (хотя по коду в принципе видно). Скачивается файл с информацией о версии, и если она различается с текущей - программа обновляет основной .exe. Если я вместо скачки файла version буду скачивать файл, содержащий контрольную сумму и ее сравнивать - что изменится? Не понимаю, что от этого изменится, но.... попробую

Вы интересовались, как у других сделано обновление. Я взял пример с текстового редактора Notepad++. У них приложение запрашивает из сети файл:

http://downloads.sourceforge.net/project/npppluginmgr/xml/plugins.md5.txt

Антивирусы на это дело не ругаются  :)

Ссылка на комментарий
Поделиться на другие сайты

@Daemvil,

Варианты для решения проблем с Касперским:

1. Участвовать в Whitelist: http://whitelist.kaspersky.ru/whitelist-for-partners-ru

2. Добавить на каждом ПК с антивирусом приложение в исключения.

3. Изменить механизм обновления приложения.

4. Временно отключить антивирус перед обновлением приложения.

Ссылка на комментарий
Поделиться на другие сайты

Решил проблему следующим образом: программа-апдейтер в случае наличия обновлений скачивает главный .exe, изменив расширение на .update. Затем запускает основную программу, которая проверяет наличие файла с расширением .update, и в случае нахождения оного подменяет свой .exe этим обновлением и перезапускается. Антивирусы вроде теперь молчат ))
код:


program RegistratorLoader;
 
uses
  WinInet, shellapi, windows, sysutils;
 
function AppVersion: string;
var
  dwHandle: THandle;
  dwSize: DWORD;
  lpData, lpData2: Pointer;
  uiSize: UINT;
begin
  Result:= '';
  dwSize:= GetFileVersionInfoSize(PChar('RegistratorFOG.exe'), dwSize);
  dwHandle:= 0;
  if dwSize <> 0 then
  begin
    GetMem(lpData, dwSize);
    if GetFileVersionInfo(PChar('RegistratorFOG.exe'), dwHandle, dwSize, lpData)
    then
    begin
      uiSize:= Sizeof(TVSFixedFileInfo);
      VerQueryValue(lpData, '\', lpData2, uiSize);
      with PVSFixedFileInfo(lpData2)^ do
        Result:= Format('%d.%02d.%02d.%02d', [HiWord(dwFileVersionMS),
          LoWord(dwFileVersionMS), HiWord(dwFileVersionLS),
          LoWord(dwFileVersionLS)]);
    end;
    FreeMem(lpData, dwSize);
  end;
end;
 
function GetInetFile(const fileURL, FileName: String): boolean;
const
  BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array [1 .. BufferSize] of Byte;
  BufferLen: DWORD;
  f: File;
  sAppName: string;
  function ExtractFileName(const FileName: string): string;
  var
    I: Integer;
  begin
    for I:= High(FileName) downto Low(FileName) do
      if FileName[I] = '\' then
        break;
    Result:= Copy(FileName, I + 1, length(FileName) - I);
  end;
 
begin
  Result:= False;
  sAppName:= ExtractFileName(paramstr(0));
  hSession:= InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,
    nil, nil, 0);
  try
    hURL:= InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
    try
      AssignFile(f, FileName);
      Rewrite(f, 1);
      repeat
        InternetReadFile(hURL, @Buffer, Sizeof(Buffer), BufferLen);
        BlockWrite(f, Buffer, BufferLen)
      until BufferLen = 0;
      CloseFile(f);
      Result:= True;
    finally
      InternetCloseHandle(hURL)
    end
  finally
    InternetCloseHandle(hSession)
  end
end;
 
var
  NewVer, isCritical, message_: string;
  T: Text;
  AcceptUpd: Integer;
  uTyp, res: Cardinal;
  fl: boolean;
  exeName, verName: string;
 
procedure WinExec(const ACmdLine: String; const ACmdShow: UINT = SW_SHOWNORMAL);
var
  SI: TStartupInfo;
  PI: TProcessInformation;
  CmdLine: String;
begin
  Assert(ACmdLine <> '');
 
  CmdLine:= ACmdLine;
  UniqueString(CmdLine);
 
  FillChar(SI, Sizeof(SI), 0);
  FillChar(PI, Sizeof(PI), 0);
  SI.cb:= Sizeof(SI);
  SI.dwFlags:= STARTF_USESHOWWINDOW;
  SI.wShowWindow:= ACmdShow;
 
  SetLastError(ERROR_INVALID_PARAMETER);
{$WARN SYMBOL_PLATFORM OFF}
  Win32Check(CreateProcess(nil, PChar(CmdLine), nil, nil, False,
    CREATE_DEFAULT_ERROR_MODE
    {$IFDEF UNICODE} or CREATE_UNICODE_ENVIRONMENT{$ENDIF}, nil, nil, SI, PI));
{$WARN SYMBOL_PLATFORM ON}
  CloseHandle(PI.hThread);
  CloseHandle(PI.hProcess);
end;
 
begin
  exeName:= 'RegistratorFOG';
  verName:= 'version';
  GetInetFile('https://dl.dropboxusercontent.com/u/24818729/RegRepo/' +
    verName, verName);
  AssignFile(T, verName);
  ReSet(T);
  ReadLn(T, NewVer);
  ReadLn(T, isCritical);
  CloseFile(T);
  deletefile(verName);
  fl:= False;
  if NewVer <> AppVersion then
  begin
    if isCritical = 'Critical' then
    begin
      uTyp:= MB_ICONWARNING + MB_YESNO;
      message_:= 'Доступно критическое обновление программы. Обновить?';
      fl:= True;
    end
    else
    begin
      uTyp:= MB_ICONQUESTION + MB_YESNO;
      message_:= 'Доступно обновление программы. Обновить?';
      fl:= True;
    end;
    if fl then
      if messagebox(0, PChar(message_), PChar('Обновление RegistratorFOG'),
        uTyp) = idYes then
      begin
        if not GetInetFile
          ('https://dl.dropboxusercontent.com/u/24818729/RegRepo/' + exeName +
          '.exe', exeName + '.update') then
          messagebox(0, PChar('Ошибка обновления'),
            PChar('Обновление RegistratorFOG'), MB_ICONERROR + MB_OK);
      end;
  end;
 
  WinExec(exeName + '.exe');
 
end.

 

  • Согласен 2
Ссылка на комментарий
Поделиться на другие сайты

 

неверное решение. все решается через

 

 

исключения в антивирусах

 

Не согласен, обоснуйте, что это единственно верное решение. Каждый выбирает сам. Например:

1. далеко не на всех машинах антивирусы позволяют добавлять в исключения (настройка автоматических действий при какой-либо опасности)

2. некоторые антивирусы после добавления в исключения через некоторое время снова блокируют программу, а некоторые и вовсе не дают добавить в исключения (пример: mcAfee как-то давно взял и удалил половину моих скомпилированных программ, перенеся на карантин, сказав, что это вирусы, без возможности добавить в "исключения". Правда, потом вернул часть, но осадок остался)) )

3. согласитесь, намного приятней, когда пользователь запускает программу, и сразу все работает, без каких-либо манипуляций с антивирусом. А из-за некоторых мнительных пользователей может пострадать репутация разработчика.

  • Согласен 1
Ссылка на комментарий
Поделиться на другие сайты

 

Решил проблему следующим образом: программа-апдейтер в случае наличия обновлений скачивает главный .exe, изменив расширение на .update. Затем запускает основную программу, которая проверяет наличие файла с расширением .update, и в случае нахождения оного подменяет свой .exe этим обновлением и перезапускается. Антивирусы вроде теперь молчат ))
код:

 

program RegistratorLoader;
 
uses
  WinInet, shellapi, windows, sysutils;
 
function AppVersion: string;
var
  dwHandle: THandle;
  dwSize: DWORD;
  lpData, lpData2: Pointer;
  uiSize: UINT;
begin
  Result:= '';
  dwSize:= GetFileVersionInfoSize(PChar('RegistratorFOG.exe'), dwSize);
  dwHandle:= 0;
  if dwSize <> 0 then
  begin
    GetMem(lpData, dwSize);
    if GetFileVersionInfo(PChar('RegistratorFOG.exe'), dwHandle, dwSize, lpData)
    then
    begin
      uiSize:= Sizeof(TVSFixedFileInfo);
      VerQueryValue(lpData, '\', lpData2, uiSize);
      with PVSFixedFileInfo(lpData2)^ do
        Result:= Format('%d.%02d.%02d.%02d', [HiWord(dwFileVersionMS),
          LoWord(dwFileVersionMS), HiWord(dwFileVersionLS),
          LoWord(dwFileVersionLS)]);
    end;
    FreeMem(lpData, dwSize);
  end;
end;
 
function GetInetFile(const fileURL, FileName: String): boolean;
const
  BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array [1 .. BufferSize] of Byte;
  BufferLen: DWORD;
  f: File;
  sAppName: string;
  function ExtractFileName(const FileName: string): string;
  var
    I: Integer;
  begin
    for I:= High(FileName) downto Low(FileName) do
      if FileName[I] = '\' then
        break;
    Result:= Copy(FileName, I + 1, length(FileName) - I);
  end;
 
begin
  Result:= False;
  sAppName:= ExtractFileName(paramstr(0));
  hSession:= InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG,
    nil, nil, 0);
  try
    hURL:= InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
    try
      AssignFile(f, FileName);
      Rewrite(f, 1);
      repeat
        InternetReadFile(hURL, @Buffer, Sizeof(Buffer), BufferLen);
        BlockWrite(f, Buffer, BufferLen)
      until BufferLen = 0;
      CloseFile(f);
      Result:= True;
    finally
      InternetCloseHandle(hURL)
    end
  finally
    InternetCloseHandle(hSession)
  end
end;
 
var
  NewVer, isCritical, message_: string;
  T: Text;
  AcceptUpd: Integer;
  uTyp, res: Cardinal;
  fl: boolean;
  exeName, verName: string;
 
procedure WinExec(const ACmdLine: String; const ACmdShow: UINT = SW_SHOWNORMAL);
var
  SI: TStartupInfo;
  PI: TProcessInformation;
  CmdLine: String;
begin
  Assert(ACmdLine <> '');
 
  CmdLine:= ACmdLine;
  UniqueString(CmdLine);
 
  FillChar(SI, Sizeof(SI), 0);
  FillChar(PI, Sizeof(PI), 0);
  SI.cb:= Sizeof(SI);
  SI.dwFlags:= STARTF_USESHOWWINDOW;
  SI.wShowWindow:= ACmdShow;
 
  SetLastError(ERROR_INVALID_PARAMETER);
{$WARN SYMBOL_PLATFORM OFF}
  Win32Check(CreateProcess(nil, PChar(CmdLine), nil, nil, False,
    CREATE_DEFAULT_ERROR_MODE
    {$IFDEF UNICODE} or CREATE_UNICODE_ENVIRONMENT{$ENDIF}, nil, nil, SI, PI));
{$WARN SYMBOL_PLATFORM ON}
  CloseHandle(PI.hThread);
  CloseHandle(PI.hProcess);
end;
 
begin
  exeName:= 'RegistratorFOG';
  verName:= 'version';
  GetInetFile('https://dl.dropboxusercontent.com/u/24818729/RegRepo/' +
    verName, verName);
  AssignFile(T, verName);
  ReSet(T);
  ReadLn(T, NewVer);
  ReadLn(T, isCritical);
  CloseFile(T);
  deletefile(verName);
  fl:= False;
  if NewVer <> AppVersion then
  begin
    if isCritical = 'Critical' then
    begin
      uTyp:= MB_ICONWARNING + MB_YESNO;
      message_:= 'Доступно критическое обновление программы. Обновить?';
      fl:= True;
    end
    else
    begin
      uTyp:= MB_ICONQUESTION + MB_YESNO;
      message_:= 'Доступно обновление программы. Обновить?';
      fl:= True;
    end;
    if fl then
      if messagebox(0, PChar(message_), PChar('Обновление RegistratorFOG'),
        uTyp) = idYes then
      begin
        if not GetInetFile
          ('https://dl.dropboxusercontent.com/u/24818729/RegRepo/' + exeName +
          '.exe', exeName + '.update') then
          messagebox(0, PChar('Ошибка обновления'),
            PChar('Обновление RegistratorFOG'), MB_ICONERROR + MB_OK);
      end;
  end;
 
  WinExec(exeName + '.exe');
 
end.

 

А если имя файла будет "flashplayer.update" ,то антивирусы опять ругаться начнут  :)

  • Улыбнуло 1
Ссылка на комментарий
Поделиться на другие сайты

А если имя файла будет "flashplayer.update" ,то антивирусы опять ругаться начнут  :)

Понять бы еще логику, почему антивирусы блокируют программы, которые такие действия совершают. Ничего зловредного ведь не происходит.

 

Ссылка на комментарий
Поделиться на другие сайты

 

А если имя файла будет "flashplayer.update" ,то антивирусы опять ругаться начнут  :)

Понять бы еще логику, почему антивирусы блокируют программы, которые такие действия совершают. Ничего зловредного ведь не происходит.

 

 

На самом деле приведенный код - типичный Trojan-Downloader ... начинать нужно с простого:

1. Не запускать этот код при старте приложения (или в виде отдельного приложения, как в примере), а встроить его в свое обновляемое приложение. Получим одним EXE меньше и меньше реакции от антивирусов. Далее в приложении делаем меню "проверить наличие новой версии", запускающее код проверки версии. При желании можно запускать его автоматом скажем раз в N>5 дней, делая пометку в реестре о дате последней проверки (но никак не при каждом запуске, я как админ большой сети задушил столько подобных обновляторов, которые лезут по 20 раз на дню версии проверять - давно уже со счета сбился... Положительный момент -= антивирус не будет ругаться при каждом старте, даже если его эвристике что-то не понравится

2. Качать обновления с своего сайта, посвященного приложению, а на с файлопомойки типа dropboxusercontent.com

3. Проверять обновления в два приема - сначала качать сведения о обновлении, а в случае надобности потом его самого. Методика обновления в примере уж не обижайтесь, пример того, как не надо это делать ... а если файл например битым скачается например ?! Мы тупо его запустим, даже не зная, что там.

Правильно это делается так:

3.1 на шаге 2 в сведениях об обновлении принимаем не только актуальную версию файла, но и его MD5 (на месте MD5 - любой хеш по желанию) и размер файла

3.2 в запросе подтверждения сообщаем юзеру, что будет закачано N кб (может, у него канал медленный и десмяток бегабайт ему качать не очень хочется), после подтверждения юзером обновления качаем файл куда-то в TEMP. При этом делаем цикл InternetReadFile в отдельном потоке (или вызываем Application.ProcessMessages хотя бы), показываем прогресс-индикатор, чтобы при длительной закачке при тормозном канале было понятно, что приложение не висит, а качает. Для отображения прогресс-индикатора используем размер, полученный на шаге 2

3.3 скачав, проверяем его размер и MD5. Если не совпадает, то был некий глюк закачки - можно попробовать еще раз, если не выйдет - выдать юзеру ошибку, что дескать обновиться не удается (в коде этого нет)

3.4 MD5 совпала - значит, загрузили что нужно. далее приложению нужно обновить самого себя. Это очень просто: 

- удаляем файл *.old в каталоге нашего приложения

- переименовываем свое приложение в *.old (полное текущее имя нашего EXE - Application.ExeName). Убеждаемся, что это сработало (файл запущенного EXE блокирован на удаление, но вот переименовывать его можно без проблем !). Если не может переименовать свой файл, то скорее всего нет прав на это, о чем и информируем юзера и завершаем обновление

- копируем загруженный на шаге 2.3 файл под именем Application.ExeName. Если успешно - хорошо, удаляем копию загруженного файла из Temp, если нет - переименовываем свой EXE назад в Application.ExeName и ругаемся на ошибку

- Сообщаем юзеру, что приложение успешно обновлено и нужно его перезапустить - запускаем приложение Application.ExeName и завершаем работу. Вуаля, запустилась новая версия.  

Файл *.old можно убивать при запуске, если он найдется, а можно и оставить - таким образом всегда после обновления останется предыдущая версия приложения на всякий случай и можно откатиться на нее в случае глюков

4. Добавить к своему приложению цифровую подпись. Наличие ЦП всегда хорошо, хотя и не обязательно.

  • Спасибо (+1) 1
Ссылка на комментарий
Поделиться на другие сайты

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Похожий контент

    • MiStr
      Автор MiStr
      Последние несколько дней захожу на форум и всё жду: когда же мы превысим порог в 50 000 сообщений? Судя по активности, это должно произойти скоро. Заснимите скриншот, если кто будет на форуме в момент икс.
       
      На момент написания сообщения всего на форуме около 49 900 сообщений.
    • linnur
      Автор linnur
      Здравствуйте имеется KES 11 версии, необходимо обновить на версии 12 на ос виндовс. Проблема заключается в том, что большое чисто компьютеров локальные (без сети) и обновление получают через флешку (через утилиту KUU). Подскажите, возможно ли обновление версии без ручного обхода всех ПК, а автоматически с правами пользователя?
    • Couita
      Автор Couita
      Проект в Visual Studio 2019 Winforms с одной кнопкой и пакетом AntdUI вызывает срабатывание антивируса Kaspersky Standard. 
      Первое срабатывание:  VHO:Trojan-PSW.MSIL.Convagent.gen 
      MD5: 17F7D1AFB121CF22F6C93E62134E7681
      Второе срабатывание: not-a-virus:VHO:RiskTool.MSIL.Convagent.gen
      MD5: 44bdb7ae0fb1682e7a5fd23adfa72040
      Является ли это ложным срабатыванием?
    • Виталий Чебыкин
      Автор Виталий Чебыкин
      Добрый день!
      Может вопрос уже решался ранее но ответа на него я не нашел. В домене есть множество клиентов KES при обновлении который с версии 12.3 - 12.8. На множестве клиентах вышла ошибка при обновлении следующая: Kaspersky Endpoint Security для Windows (12.8.0) (12.8.0.505): Удаленная установка на устройстве завершена с ошибкой: В процессе установки произошла неисправимая ошибка. (Установка Kaspersky Endpoint Security для Windows не может быть выполнена, так как на компьютере установлено стороннее приложение: Eset Endpoint Antivirus 5.0.2214.7. Чтобы выполнить установку Kaspersky Endpoint Security для Windows, необходимо удалить стороннее приложение стандартными средствами Microsoft Windows или иными способами.)
      Подскажите почему сам инсталятор не удаляет Eset Endpoint Antivirus сам если при создании задачи в KSC я выбрал удалить все не совместимые продукты? Данные УЗ при инсталляции есть домена и локального админа. При этом если устанавливаешь вручную он дает поставить. Да и до этого стояла версия другая 12.3. Можно как то выяснить что конкретно KES проверяет при установке?
    • vit451
      Автор vit451
      Добрый день.
      KSC 15.1
       
      Как то не могу понять логику как быстро обновлять ПО , ранее установленное средствами KSC.
       
      Например, ставлю клиента Битрикс.
      Для установки делаю задачу, в параметрах задачи выбираю устройства из списка управляемых. Стартую, все ок, программа установилась. 
       
      Позже выходит новая версия, надо обновится. 
      По идее у меня уже есть задача с списком машин для установки, надо просто внутри задачи заменить пакет для установки. Но в настройках задачи это сделать невозможно. 
       
      Есть группы, на которые можно повесить установку ПО. Но устройство может состоять только в одной группе, нельзя по аналогии с GPO добавить устройство в множество групп, на которые в свою очередь повесить установку ПО. 
       
      Сейчас я для обновления ПО экспортирую список устройств в файл, далее делаю новую задачу, выбираю инсталляционный пакет для установки,а устройства импортирую из файла. 
      Но должен быть явно более простой путь. 
       
×
×
  • Создать...