Удалите файл installstate поскольку отсутствуют программы установки

Обновлено: 07.07.2024

Довольно распространённая проблема среди пользователей операционной системы Windows любых версий – ошибка msi при установке программ из файла с расширением .msi. В этой статье я опишу часто встречаемые проблемы с установщиком Windows 7/10/XP и варианты их решения, а также сделаю видео по текущему вопросу.

Файлы с расширением .msi это обычные пакеты установки (дистрибутивы) из которых ставится программа. В отличии от обычных «setup.exe», для запуска файла msi система использует службу Windows Installer (процесс msiexec.exe). Говоря простыми словами, установщик Windows разархивирует и запускает файлы из дистрибутива. Когда Windows Installer не работает, то появляются различные ошибки.

Неполадки могут быть с работой самой службы или могут возникать в процессе установки программ, когда всё настроено, в принципе, правильно. В первом случае нужно ковырять службу установщика, а во втором решать проблему с конкретным файлом. Рассмотрим оба варианта, но сначала второй.

Ошибки msi файлов

Очень часто ошибки появляются из-за недостаточных прав системы на файлы или папки. Нельзя сказать, что Windows Installer не работает, в этом случае достаточно просто добавить нужные права и всё заработает. Буквально вчера я столкнулся с тем, что скаченный дистрибутив .msi не захотел устанавливаться, при этом успешно запускается мастер установки, выбираются параметры, но затем система думает несколько секунд и выдаёт ошибку:

Error reading from file Error 1305

А ошибка в том, что не Я должен иметь доступ к файлу, а установщик Windows, точнее сама Система. Решается очень просто:

  1. Кликаем правой кнопкой по файлу с расширением .msi, выбираем «Свойства»
  2. На вкладке «Безопасность» смотрим, есть ли в списке пользователь с именем «система» или «System»
  3. Скорее всего вы такого не увидите. Поэтому будем добавлять вручную. Нажимаем кнопку «Изменить…», затем «Добавить…»
  4. В поле пишем «система» или «System» (если у вас английская Windows) и нажимаем «Проверить имена». При этом слово должно стать подчёркнутым как на картинке.
  5. Нажимаем «ОК», ставим галочку «Полный доступ», «ОК»
  6. Кнопка «Дополнительно» -> «Изменить разрешения…» ставим «Добавить разрешения, наследуемые от родительских объектов», «ОК» три раза.

Теперь ошибка установщика не появится! Можно добавить доступ на всю папку, из которой вы обычно инсталлируете программы, например на папку «Downloads», как у меня. Смотрим видео по решению проблем с правами доступа:

В Windows XP вкладки «Безопасность» не будет, если включён простой общий доступ к файлам. Чтобы его выключить, нужно зайти в «Пуск -> Панель управления -> Свойства папки -> Вид» и выключить опцию «Использовать простой общий доступ к файлам». В урезанных версиях Windows 7/10 и XP вкладки «Безопасность» нет в принципе. Чтобы её увидеть, нужно загрузить Windows в безопасном режиме и зайти в неё под администратором.

Ещё способы решить проблему

  • Error 1723
  • Internal Error 2203
  • Системная ошибка 2147287035
  • Ошибка «Невозможно открыть этот установочный пакет»
  • Ошибка 1603: Во время установки произошла неустранимая ошибка

Во всех этих случаях должна помочь установка прав на файл и/или на некоторые системные папки. Проверьте, имеет ли доступ «система» к папке временных файлов (вы можете получать ошибку «Системе не удается открыть указанное устройство или файл»). Для этого:

  1. Сначала узнаем нужные пути. Нажмите «Win + Pause» и зайдите в «Дополнительные параметры системы -> Вкладка «Дополнительно» -> кнопка «Переменные среды»»
  2. В списках ищем переменные с названиями «TEMP» и «TMP» (значения обычно совпадают), в них записаны пути к временным папкам, которые использует установщик Windows
  3. Теперь идём к этим папкам и смотрим в их свойствах, имеет ли к ним доступ «система». Чтобы быстро получить путь к временной папке пользователя, кликните два раза по переменной, скопируйте путь и вставьте его в адресной строке «Проводника» Windows

Путь к временной папке TEMP


После нажатия «Enter» путь преобразится на «нормальный» и вы переместитесь в реальную временную папку. Права на неё и надо проверять. Также рекомендую очистить временные папки от всего что там скопилось или даже лучше удалить их и создать новые с такими же названиями. Если не получается удалить папку, почитайте как удалить неудаляемое, но это не обязательно.

Если служба Windows Installer всё равно не хочет работать, то проверьте права на папку «C:\Config.Msi», сюда «система» также должна иметь полный доступ. В этом случае вы могли наблюдать ошибку «Error 1310». На всякий случай убедитесь, что к папке КУДА вы инсталлируете софт также есть все права.

Если вы используете шифрование папок, то отключите его для указанных мной папок. Дело в том, что хотя мы сами имеем к ним доступ, служба Microsoft Installer не может до них достучаться пока они зашифрованы.

Ещё ошибка может быть связана с битым файлом. Может быть он не полностью скачался или оказался битым уже на сервере. Попробуйте скачать его ещё раз оттуда же или лучше с другого места.

Ошибка установщика Windows

В случае общих проблем не будут устанавливаться никакие msi файлы, процесс установки, скорее всего, даже не начнётся. При этом могут появляться ошибки вида:

  • Нет доступа к службе установщика Windows
  • Не удалось получить доступ к службе установщика Windows
  • Ошибка пакета установщика Windows (1719)

или ещё нечто подобное со словами «ошибка msi», «Windows Installer Error». Всё это означает, что система дала сбой и теперь её надо лечить. Может вы ставили какой-то софт, который испортил системные файлы и реестр, или подхватили вирус. Конечно, никогда не будет лишним удалить вирусы, или убедиться что их нет. Но оставьте этот вариант на потом, т.к. обычно проблема кроется в другом.

Сначала давайте проверим работает ли служба Windows Installer:

Служба установщик Windows Installer

  1. Нажмите «Win + R» и введите services.msc
  2. Найдите в конце списка службу «Установщик Windows» или «Windows Installer»
  3. Тип запуска должен быть «Вручную». Если она «Отключена», то зайдите в «Свойства» и выберите «Вручную»
  4. Затем кликните по ней правой кнопкой и выберите «Запустить» или «Перезапустить». Если ошибок нет и состояние переходит в режим «Работает», то здесь всё нормально.
  5. Нажмите «Win + R» и введите msiexec. Если модуль MSI работает нормально, то должно появиться окно с версией установщика и параметрами запуска, а не ошибка.

Следующее что я посоветую сделать – это выполнить команду сканирования системы на повреждённые и изменённые системные файлы. Нажмите «Win + R» и введите

Sfc /scannow

Произойдёт поиск и замена испорченных файлов на оригинальные, при этом может потребоваться вставить установочный диск с Windows XP-7-10. После окончания процесса перегрузитесь и посмотрите, решена ли проблема.

Microsoft сам предлагает утилиту, призванную решить нашу проблему. Запустите программу Easy Fix и следуйте мастеру.

Параметры реестра и службы

Следующий способ устранения ошибки – восстановление рабочих параметров в реестре установщика Windows Installer.

Для этого скачайте архив и запустите оттуда два reg-файла, соответственно своей версии Windows. Согласитесь с импортом настроек.

Важно! Перед последним действием желательно создать точку восстановления системы! Если способ не поможет или станет хуже, вы сможете восстановиться до прежнего состояния.

В Windows XP или Windows Server 2000 установите последнюю версию установщика 4.5.

Если не помогло, то проделайте ещё перерегистрацию компонентов:

Если пишет, что не хватает прав, то нужно запускать командную строку от имени Администратора.

Если команды выполнились, но не помогло, то скачайте файл и запустите msi_error.bat из архива, проверьте результат.

Подведение итогов

Репутация: нет
Всего: нет


остальное оставил без изменений.однако после запуска службы файл не создается.сервис вроде нормально стартует(и сразу остнаваливается,т.к. делать ему нечего).вопрос - почему нет файла?
"То,что вы понимаете - это все,что вы понимаете."
Брайн Керниган

Репутация: 22
Всего: 118

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

Цитата

сервис вроде нормально стартует(и сразу остнаваливается,т.к. делать ему нечего)
с чего бы. вот с этого и начнем разбираться.
напишем код такой :

запустим дебаггер и обнаружим, что сервис-то падает на AccessDenied
с какой учетки запускаете сервис-то?
Что-то не поняли? -> Напейтесь до зеленых человечков. эта сверхцивилизация Вам поможет.

Репутация: нет
Всего: нет

сервис ставится как LocalService.устанавливаю под админом.
"То,что вы понимаете - это все,что вы понимаете."
Брайн Керниган

Репутация: 22
Всего: 118

вы лучше код запустите что я привел.
LocalService по умолчанию доступа к FS не имеет.
короче права дай юзеру LocalService (RW) на каталог куда пишешь или запускай под другой учеткой, имеющей права.

Что-то не поняли? -> Напейтесь до зеленых человечков. эта сверхцивилизация Вам поможет.

Репутация: 14
Всего: 62

Немного офтоп.
Есть ли какие-то тонкости с установкой сервиса через installutil. Пробовал и в XP, и в Vista, эффект один и тот же: пишет, что все ок, но в списке сервисов сервис не появляется.

Репутация: 22
Всего: 118

а точно пишет-то? ты добавлял инсталлятора класс ? логи в студию кароче)
Что-то не поняли? -> Напейтесь до зеленых человечков. эта сверхцивилизация Вам поможет.

Репутация: 5
Всего: 13

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

Репутация: 22
Всего: 118

Bogdan1024 почитай что я писал выше и не надо гипотез. инсталятору вообще пофиг на разрешения. даете права на запись и все ок будет.
Что-то не поняли? -> Напейтесь до зеленых человечков. эта сверхцивилизация Вам поможет.

Репутация: 14
Всего: 62


Я решил ручками через installutil добавить. Вот что пишет:

Цитата

Выполняется групповая операция установки.

Этап фиксации выполнен успешно.

Репутация: нет
Всего: нет

jonie, ты прав,нет прав
тогда еще вопрос(пока модераторы спят).хочу вести логи.и проверяю,есть ли уже:

так вот когда доходит дело до второй строки - выкидывает эксепшн,мол такой(SCServiceLogSource) уже есть .
"То,что вы понимаете - это все,что вы понимаете."
Брайн Керниган

Репутация: 22
Всего: 118

Цитата

Отсутствуют общие программы установки с атрибутом RunInstallerAttribute.Yes

Idsa ну он и пишет даже по-русски, что у тебя нету инсталятора класса.
в двух словах тыкаешь дважды на Service1.cs (от откроет редактор). тыкаешь правой на основном окне (НЕ окне просмотра решения), там есть Add Installer в меню. Мастер создает еще один класс инсталятора, и связывает его с твоим сервисом.

4ybaka не юзаю стандартную писалку в логи. так что хз. попробуй для начала делать тоже не из сервиса)

Что-то не поняли? -> Напейтесь до зеленых человечков. эта сверхцивилизация Вам поможет.

Репутация: 14
Всего: 62

jonie, получилось. Спасибо Первый раз с Windows Service работал. +1.

Репутация: нет
Всего: нет

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

Но пришлось переделывать код и в результате нужно было удалять службу, результат:

После перезагрузки и попытки заинсталить службу:

Выполняется групповая операция установки.

На этапе установки возникло исключение.
System.ArgumentException: Источник Test Service [Server] уже существует на лока
льном компьютере.

Этап отката выполнен успешно.

UPD:
"А ларчик просто открывался": добавил ветку с именем Test Service [Server] в ../EventLog/Application и все заработало.

Я пробовал следующие шаги:

Результат шага 4

Запуск транзакционной установки.

Начало этапа установки.

Просмотрите содержимое файла журнала для прогресса сборки C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.

Файл находится в C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

Установка сборки 'C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'.

Затронутые параметры:

logtoconsole =

logfile = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ T estService \ obj \ x86 \ Debug \ TestService.InstallLog

путь к сборке = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

В сборке C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe не найдено общедоступных установщиков с атрибутом RunInstallerAttribute.Yes.

Фаза установки успешно завершена, а этап фиксации начинается.

Просмотрите содержимое файла журнала для прогресса сборки C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe.

Файл находится в C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog.

Фиксация сборки 'C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'.

Затронутые параметры:

logtoconsole =

logfile = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ T estService \ obj \ x86 \ Debug \ TestService.InstallLog

путь к сборке = C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

В сборке C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe не найдено общедоступных установщиков с атрибутом RunInstallerAttribute.Yes.

Удалите файл InstallState, потому что нет установщиков.

Фаза фиксации завершена успешно.

Завершена трансертированная установка.

Результат этапа 5

Имя службы недействительно.

Дополнительную помощь можно получить, набрав NET HELPMSG 2185.

Вам нужно открыть файл Service.cs в дизайнере, щелкнуть его правой кнопкой мыши и выбрать пункт меню «Добавить установщик».

Он не будет устанавливаться прямо из коробки . вам нужно сначала создать класс установщика.

Справочник по установщику службы:

Довольно старый . но вот о чем я говорю:

Таким образом, автоматически будет создан ProjectInstaller.cs . Затем вы можете дважды щелкнуть по нему, войти в конструктор и настроить компоненты:

serviceInstaller1 имеет свойства самой службы: Description , DisplayName , ServiceName и StartType являются наиболее важными.

serviceProcessInstaller1 имеет следующее важное свойство: Account это учетная запись, в которой будет работать служба.

Еще одна уловка, с которой я столкнулся: убедитесь, что ваш производный класс установщика (обычно ProjectInstaller ) находится на вершине иерархии пространства имен, я попытался использовать открытый класс в другом общедоступном классе, но это привело к той же старой ошибке:

Не удалось найти общедоступных установщиков с атрибутом RunInstallerAttribute.Yes

Не удалось найти общедоступных установщиков с атрибутом RunInstallerAttribute.Yes

Если у вас есть следующий код…

Возможно, вам потребуется обновить его до

Это похоже на псевдоним, измененный под оболочкой во время компиляции или во время выполнения, и вы получите такое поведение ошибки. Вышеупомянутое явное изменение для RunInstallerAttribute (true) исправило его во всех наших сценариях установки на всех машинах.

После добавления установщика проекта или службы проверьте наличие «старого» RunInstaller (true) и измените его на новый RunInstallerAttribute (true).

Еще одна возможная проблема (с которой я столкнулся):

Убедитесь, что класс ProjectInstaller равен public . Честно говоря, я не уверен, как именно я это сделал, но я добавил обработчики событий в ProjectInstaller.Designer.cs , например:

this.serviceProcessInstaller1.BeforeInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_BeforeInstall);

Я предполагаю, что во время автоматического процесса создания функции-обработчика в ProjectInstaller.cs он изменил определение класса с

public class ProjectInstaller : System.Configuration.Install.Installer

partial class ProjectInstaller : System.Configuration.Install.Installer

public partial class ProjectInstaller : System.Configuration.Install.Installer

Я использую Visual Studio 2013 Community edition.

Две типичные проблемы:

  1. Отсутствует класс ProjectInstaller (как указал @MiguelAngelo)
  2. В командной строке должно быть указано «Запуск от имени администратора ».

Вам просто нужно создать класс и добавить приведенный ниже код и добавить ссылку System.Configuration.Install.dll.

В сборке C: \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe не найдено общедоступных установщиков с атрибутом RunInstallerAttribute.Yes.

Похоже, в вашем коде может не быть класса установщика. Это класс, унаследованный от Installer , который сообщает installutil , как установить исполняемый файл как службу.

Программа для установки является программой командной строки, с помощью которой можно устанавливать и удалять ресурсы сервера путем выполнения компонентов установщика в соответствующих сборках. Эта программа работает совместно с классами в пространстве имен System.Configuration.Install.

Эта программа автоматически устанавливается вместе с Visual Studio. Для запуска этого средства используйте Командную строку разработчика или PowerShell для разработчиков в Visual Studio.

В командной строке введите следующее.

Синтаксис

Параметры

Аргумент Описание
assembly Имя файла сборки, в которой должны выполняться компоненты установщика. Пропустите этот параметр, если указывается строгое имя сборки с помощью параметра /AssemblyName .

Параметры

Culture = языковой стандарт,

Дополнительные параметры установщика

Отдельные установщики, используемые в сборке, кроме перечисленных в разделе Параметры, могут распознавать и другие параметры. Чтобы узнать об этих параметрах, запустите программу InstallUtil.exe с путями к сборкам в командной строке, а также с параметром /? или /help . Чтобы задать эти параметры, необходимо включить их в командную строку вместе с параметрами, распознаваемыми программой InstallUtil.exe.

Текст справки о параметрах, поддерживаемых отдельными компонентами установщика, возвращается свойством Installer.HelpText. Отдельные параметры, которые были введены в командной строке, доступны программно из свойства Installer.Context.

Все параметры командной строки записываются в файл журнала установки. Однако если используется параметр /Password , распознаваемый некоторыми компонентами установщика, сведения о пароле будут заменены восемью звездочками (*) и не будут отображаться в файле журнала.

В некоторых случаях передаваемые в установщик параметры могут содержать конфиденциальные или личные сведения, которые по умолчанию записываются в обычный текстовый файл журнала. Для предотвращения этого поведения можно запретить ведение журнала, указав в командной строке /LogFile= (без аргумента имя_файла) после программы Installutil.exe.

Примечания

В командной строке можно указать сразу несколько сборок. Параметры должны указываться перед именами сборок, к установке которых они относятся. За исключением /u и /AssemblyName , параметры являются накопительными, но переопределяемыми. То есть параметры, указанные для одной сборки, применяются и ко всем последующим сборкам. Исключением являются параметры, с которыми указывается новое значение.

При запуске программы Installutil.exe для сборки без указания параметров она помещает в каталог сборки следующие три файла.

InstallUtil.InstallLog — содержит общее описание хода выполнения установки.

имя_сборки.InstallLog — содержит сведения, относящиеся к этапу фиксации процесса установки. Дополнительные сведения об этапе фиксации см. в описании метода Commit.

имя_сборки.InstallState — содержит данные, используемые для удаления сборки.

Программа Installutil.exe не может устанавливать или удалять сборки с отложенной подписью, но может устанавливать и удалять сборки со строгими именами.

Примеры

Следующая команда выводит описание синтаксиса и параметров команды для программы InstallUtil.exe.

Следующая команда выводит описание синтаксиса и параметров команды для программы InstallUtil.exe. Она также отображает для myAssembly.exe описание и список параметров, поддерживаемых компонентами установщика, если свойству Installer.HelpText установщика было задано значение текста справки.

Следующая команда выполняет компоненты установщика в сборке myAssembly.exe .

Следующая команда выполняет компоненты установщика в сборке с помощью ключа /AssemblyName и полного имени.

Следующая команда выполняет компоненты установщика в сборке, заданной по имени файла, и в сборке, заданной по строгому имени. Обратите внимание, что все сборки, указанные по имени файла, должны предшествовать сборкам, указанным по строгому имени в командной строке, потому что параметр /AssemblyName не может быть переопределен.

Следующая команда выполняет компоненты программы удаления в сборке myAssembly.exe .

Следующая команда выполняет компоненты программы удаления в сборках myAssembly1.exe и myAssembly2.exe .

Поскольку позиция параметра /u в командной строке не имеет значения, результат аналогичен выполнению следующей команды.

Я пробовал следующие шаги:

Вывод шага 4

Вывод этапа 5

Недопустимое имя службы.

Дополнительную помощь можно получить, набрав NET HELPMSG 2185.

Некоторая ссылка на сервис-установщик:

При этом автоматически создается ProjectInstaller.cs . Затем вы можете дважды щелкнуть по нему, ввести конструктор и настроить компоненты:

serviceInstaller1 имеет свойства самой службы: Description , DisplayName , ServiceName и StartType являются наиболее важными.

Никаких публичных инсталляторов с атрибутом RunInstallerAttribute.Yes можно найти в сборке C:\Users\myusername\Documents\Visual Studio 2010\Projects\TestService\TestSe rvice\obj\x86\Debug\TestService.exe.

Похоже, у вас может не быть класса установщика в вашем коде. Это класс, который наследует от Installer , который сообщает installutil , как установить ваш исполняемый файл как службу.

P.s. У меня есть мой собственный собственный самозагружаемый/отлаживаемый шаблон службы Windows, в котором вы можете скопировать код или использовать: Отладка, самоостановка службы Windows

Вам просто нужно создать класс и добавить код ниже и добавить ссылку System.Configuration.Install.dll.

Другая возможная проблема (с которой я столкнулся):

Убедитесь, что класс ProjectInstaller public . Честно говоря, я не уверен, как именно я это сделал, но добавил обработчики событий в ProjectInstaller.Designer.cs , например:

this.serviceProcessInstaller1.BeforeInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_BeforeInstall);

Я думаю, что во время автоматического процесса создания функции обработчика в ProjectInstaller.cs он изменил определение класса из

public class ProjectInstaller : System.Configuration.Install.Installer

partial class ProjectInstaller : System.Configuration.Install.Installer

public partial class ProjectInstaller : System.Configuration.Install.Installer

Я использую редакцию Visual Studio 2013 Community.

Две типичные проблемы:

Нет общедоступных инсталляторов с атрибутом RunInstallerAttribute.Yes.

Вам может потребоваться обновить его до

Это похоже на псевдоним, измененный под обложками во время компиляции или во время выполнения, и вы получите это поведение ошибки. Вышеуказанное явное изменение в RunInstallerAttribute (true) зафиксировало его во всех наших сценариях установки на всех машинах.

Читайте также: