Преобразовывая приложения установки в WiX, я столкнулся со следующим явлением для приложения службы Windows, написанного на C#:
1.) При настройке основного EXE-компонента с разделом ServiceInstall, назначающим Account="LocalSystem", приложение будет успешно установлено, но не будет запущено (-start). У него нет аутентификации в базе данных, к которой он будет подключаться, так что это не удивительно.
2.) Используя установку из п.1, применяю ValidAccount и ValidPassword на вкладке "Вход" свойств для сервиса. Служба запускается и успешно работает, когда делается вручную, как и ожидалось.
3.) Возвращаясь к проекту Wix, я изменяю вышеупомянутый раздел ServiceInstall, чтобы использовать тот же Account="ValidAccount" Password="ValidPassword", что и на шаге 2, и перестраиваю файл MSI. Установка не устанавливается со следующими сообщениями журнала сразу после ServiceInstall:
InstallServices: Service:
Error 1923. Service 'My Service' (MyService.exe) could not be installed. Verify that you have sufficient privileges to install system services.
MSI (s) (B4:30) [12:54:38:616]: I/O on thread 20432 could not be cancelled. Error: 1168
MSI (s) (B4:30) [12:54:38:616]: I/O on thread 13032 could not be cancelled. Error: 1168
MSI (s) (B4:30) [12:54:38:616]: I/O on thread 10548 could not be cancelled. Error: 1168
MSI (s) (B4:30) [12:54:38:616]: I/O on thread 19688 could not be cancelled. Error: 1168
MSI (s) (B4:30) [12:54:38:616]: I/O on thread 6588 could not be cancelled. Error: 1168
MSI (s) (B4:30) [12:54:38:616]: I/O on thread 10132 could not be cancelled. Error: 1168
MSI (s) (B4:94) [12:54:38:616]: Product: MyService -- Error 1923. Service 'My Service' (MyService.exe) could not be installed. Verify that you have sufficient privileges to install system services.
4.) Я подтвердил, что ValidAccount является членом группы локальных администраторов.
5.) Я подтвердил, что ValidAccount добавлен в политики «Вход в качестве службы».
6.) У меня нет зависимостей GAC в службе (кто-то указал, что зависимости GAC добавляются в самом конце и могут нарушить установку).
Что мне не хватает? ... даже бездействующая служба с использованием LocalSystem в порядке. Однако он не будет установлен, если я установлю учетную запись и пароль, как показано ниже.
<Fragment>
<ComponentGroup Id = "ProductComponents" Directory = "INSTALLFOLDER">
<Component Id = "TestService.exe" Guid = "196BB5E5-F157-4CA2-B740-0A68E1539B7C">
<File
Id = "TestService.exe"
Source = "$(var.TestService.TargetPath)"
KeyPath = "yes" />
<ServiceInstall
Id = "TestService.exe"
Name = "TestService.exe"
DisplayName = "Test Service"
Description = "This is a test service to test installation with WiX."
Account = "myDomain\myAccount" <!-- using myAccount without the domain yields same failure -->
Password = "myAccountPassword"
Arguments = "-start"
Start = "auto"
Interactive = "yes"
Type = "ownProcess"
Vital = "yes"
ErrorControl = "ignore" />
<ServiceControl
Id = "TestService.exe"
Name = "TestService.exe"
Stop = "both"
Start = "install"
Remove = "uninstall"
Wait = "no" />
</Component>
</ComponentGroup>
</Fragment>
Заранее спасибо,
Кент
После кучи экспериментов я пришел к ответу. На самом деле это ошибка в наборе инструментов WiX (версия 3.11.2), но я не уверен, что кто-то сделал это намеренно. Когда вы добавляете пароль в ServiceInstall, свойству Interactive ДОЛЖНО быть присвоено значение «нет».
По какой-то неизвестной причине, если вы установите значение «да», будут установлены только учетные записи, не требующие паролей.
<Fragment>
<ComponentGroup Id = "ProductComponents" Directory = "INSTALLFOLDER">
<Component Id = "TestService.exe" Guid = "196BB5E5-F157-4CA2-B740-0A68E1539B7C">
<File
Id = "TestService.exe"
Source = "$(var.TestService.TargetPath)"
KeyPath = "yes" />
<ServiceInstall
Id = "TestService.exe"
Name = "TestService.exe"
DisplayName = "Test Service"
Description = "This is a test service to test installation with WiX."
Account = "myDomain\myAccount" <!-- using myAccount without the domain yields same failure -->
Password = "myAccountPassword"
Arguments = "-start"
Start = "auto"
Interactive = "no" <!-- MUST BE NO WHEN PASSWORD IS USED -->
Type = "ownProcess"
Vital = "yes"
ErrorControl = "ignore" />
<ServiceControl
Id = "TestService.exe"
Name = "TestService.exe"
Stop = "both"
Start = "install"
Remove = "uninstall"
Wait = "no" />
</Component>
</ComponentGroup>
</Fragment>
Удачи во всех начинаниях, Кент
Это наиболее вероятный ответ. Другие ответы о фактических привилегиях установки, входе в качестве службы и отсутствующих зависимостях могут быть полезными, но они, вероятно, составляют меньшинство, которое решит эту проблему.