Не удается запустить службу Windows с WiX
У меня есть следующий проект WiX для установки моего сервиса:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="GUID" Name="SetupWinService" Language="1049"
Version="1.0.0.0" Manufacturer="SetupWinService"
UpgradeCode="GUID">
<Package InstallerVersion="200" Compressed="yes"
Languages="1049" SummaryCodepage="1251"
InstallPrivileges="elevated"/>
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="WinService" Name="My Windows Service">
</Directory>
</Directory>
</Directory>
<DirectoryRef Id="WinService">
<Component Id="WinServiceInstallation" Guid="GUID">
<File Id="ClientService.exe"
Name="ClientService.exe"
Source="...\ClientService.exe"
Vital="yes" KeyPath="yes" DiskId="1"/>
<File Id="App.config"
Name="App.config"
Source="...\App.config"
Vital="yes" KeyPath="no" DiskId="1"/>
<!--And some DLLs here-->
<ServiceInstall Id="ServiceInstaller"
Type="ownProcess"
Vital="yes"
Name="WcfServiceHost"
DisplayName="WcfServiceHost"
Description="Hosts Wcf Service"
Start="auto"
Account="LocalSystem"
ErrorControl="ignore"
Interactive="no">
</ServiceInstall>
<ServiceControl Id="StartService" Name="WcfServiceHost"
Start="install" Stop="uninstall" Remove="uninstall"
Wait="yes" />
</Component>
</DirectoryRef>
<Feature Id="Complete" Title="SetupWinService" Level="1">
<ComponentRef Id="WinServiceInstallation" />
<ComponentGroupRef Id="Product.Generated" />
</Feature>
</Product>
</Wix>
Я могу установить свой сервис, но не могу запустить его после установки. Оно говорит:
Служба не запустилась. Убедитесь, что у вас достаточно прав для запуска системных служб.
Но я запускаю мой установщик как администратор (Windows 7 Professional), а также отключаю UAC. Кроме того, я могу установить и запустить службу с помощью instalutil.exe через командную строку (мой проект службы включает реализацию класса Installer и в целом размечен в соответствии с этой статьей), и в этом случае все работает нормально со службой.
Если я заменяю Wait="yes" элемента ServiceControl на "no", служба устанавливается без ошибок, но не запускается. Я также не могу запустить службу вручную в этом случае, потому что служба запускается и сразу останавливается с сообщением "служба на локальном компьютере запускается, а затем останавливается. Некоторые службы останавливаются автоматически, если у них нет работы".
Я искал об этой проблеме в Интернете, но я не нашел никаких решений.
Как мне это исправить?
Это код моего класса установщика:
[RunInstaller(true)]
public class ProjectInstaller : Installer
{
private ServiceProcessInstaller serviceProcessInstaller;
private ServiceInstaller serviceInstaller;
public ProjectInstaller()
{
this.serviceProcessInstaller = new ServiceProcessInstaller();
this.serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
this.serviceProcessInstaller.Username = null;
this.serviceProcessInstaller.Password = null;
this.serviceInstaller = new ServiceInstaller();
this.serviceInstaller.ServiceName = "ClientServicesHost";
this.serviceInstaller.StartType = ServiceStartMode.Automatic;
this.Installers.Add(serviceProcessInstaller);
this.Installers.Add(serviceInstaller);
this.AfterInstall +=
new InstallEventHandler(ProjectInstaller_AfterInstall);
}
void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e)
{
ServiceController sc = new ServiceController("ClientServicesHost");
sc.Start();
}
}
И мой сервис Windows:
class WindowsClientService : ServiceBase
{
public ServiceHost serviceHost = null;
public WindowsClientService()
{
this.ServiceName = "WcfServiceHost";
}
public static void Main()
{
ServiceBase.Run(new WindowsClientService());
}
protected override void OnStart(string[] args)
{
if (serviceHost != null)
{
serviceHost.Close();
}
// Create a ServiceHost for WcfClientService type
// and provide the base address.
serviceHost = new ServiceHost(typeof(WcfClientService));
// Open the ServiceHost to create listeners
// and start listening for messages.
serviceHost.Open();
}
protected override void OnStop()
{
if (serviceHost != null)
{
serviceHost.Close();
serviceHost = null;
}
}
}
Мне указали, что причина моего обслуживания автоматически останавливается - он ничего не делает после запуска. Может ли так быть? Мой сервис создает слушателей и начинает слушать - это "ничего не делает"?
7 ответов
Что ж, я вернулся к этому проекту примерно через полтора года. И пытается перекомпилировать его и запустить этот сервис снова. И это работает!
Все, что изменилось, я добавил clientaccesspolicy.xml к моей службе и запустил policyServiceHost (типа WebServiceHost) вместе со своей службой. Но я не думаю, что это важно, потому что это относится к внутренностям моего приложения, а не к запуску сервиса.
Итак, я попробовал много вариантов, как:
1) this.serviceProcessInstaller.Username = null;
или же
this.serviceProcessInstaller.Username = @ "NT AUTHORITY \ SYSTEM";
2) Два или один раздел ServiceControl.
3) Стоп ="оба"
или же
Стоп ="удалить"
ВСЕ РАБОТАЕТ СЕЙЧАС!!!
Я не знаю, что происходит. Я просто оставляю это на какой-то тип ошибки или на какую-то странную конфигурацию моей системы или на что-то еще, что не позволяет мне раньше автоматически запускать мой сервис. Но сейчас все прекрасно работает.
Другими словами, я не выяснил, по какой причине мой сервис не запустился автоматически. Речь шла о "достаточных привилегиях" (см. Первый пост), но это не совсем понятно для меня даже сейчас.
Только одно замечание. Если при удалении службы я использую два раздела ServiceControl, появляется окно с предупреждением (Windows 7) и предлагается автоматически закрыть приложение (службу) и т. Д. Так что я просто принимаю и сервис удаляется хорошо. Но окна предупреждения не появляются, если я использую только один раздел ServiceControl, как в моем примере в первом посте. И снова это не имеет отношения к 1) и 3) пунктам комбинации.
Я долго искал ответ и наконец решил!
Сохраните то же имя ServiceControl, что и имя ServiceInstall.
Результат:
<?xml version="1.0" encoding="utf-8"?>
<?define ProductVersion = "1.0.0"?>
<?define ProductUpgradeCode = "{E8DFD614-41F6-4592-AD7A-27EA8A49C82E}"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Product Id="*" UpgradeCode="$(var.ProductUpgradeCode)"
Name="Eyes Relax"
Version="$(var.ProductVersion)"
Manufacturer="Ourdark"
Language="1033">
<Package Manufacturer="Ourdark" InstallerVersion="100" Languages="1033" Compressed="yes" />
<Media Id="1" Cabinet="WHSDiskManagement.1.1.0.0.cab" EmbedCab="yes" />
<Property Id="WHSLogo">1</Property>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="WHS" Name="Eyes Relax">
<Component Id="EyesRelax" Guid="{78534F5E-FC72-49E6-AF11-4F2068EA7571}">
<File Id="RelaxEyes.exe.config"
Name="RelaxEyes.exe.config"
Source="RelaxEyes\bin\Debug\RelaxEyes.exe.config"
Vital="yes"
KeyPath="no"
DiskId="1"/>
<File Id="RelaxEyes.exe"
Name="RelaxEyes.exe"
Source="RelaxEyes\bin\Debug\RelaxEyes.exe"
Vital="yes"
KeyPath="yes"
DiskId="1"/>
<ServiceInstall
Id="ServiceInstaller"
Type="ownProcess"
Vital="yes"
Name="Eyes Relax"
DisplayName="Eyes Relax"
Description="Eyes Relax"
Start="auto"
Account="NT AUTHORITY\LocalService"
ErrorControl="ignore"
Interactive="no">
</ServiceInstall>
<ServiceControl Id="StartService"
Start="install"
Stop="both"
Remove="uninstall"
Name="Eyes Relax"
Wait="yes" />
</Component>
</Directory>
</Directory>
</Directory>
<Feature Id="ProductFeature" Title="WHSDiskManagement" Level="1">
<ComponentRef Id="EyesRelax" />
</Feature>
</Product>
</Wix>
У меня была та же проблема с использованием WiX 3.7.821.0 и моего сервиса. Он был установлен некоторое время, и появилось то же раздражающее сообщение "Служба не запустилась. Убедитесь, что у вас достаточно прав для запуска системных служб".
Я много пробовал, но в итоге я использовал два раздела для <ServiceControl>
вместо того, чтобы пытаться втиснуть все в один. Один для начала и один для остановки. Теперь сервис запускается нормально.
Это не работает:
<ServiceControl Id="StartService"
Start="install"
Stop="both"
Remove="uninstall"
Name="MyService"
Wait="yes" />
Это работает:
<ServiceControl Id="ServiceControl_Start"
Name="MyService"
Start="install"
Wait="no" />
<ServiceControl Id="ServiceControl_Stop"
Name="MyService"
Stop="both"
Remove="uninstall"
Wait="yes" />
У меня была такая же ошибка, и в моем случае я отсутствовал KeyPath='yes' Vital="yes"
на моем элементе файла.
Вот мое определение компонента:
<Component Id="ComponentName"
Guid="3aa1d5a5-28f0-4753-8e4b-a7ac0848d8be" >
<File Id='ServiceFile'
Name='Service.exe'
DiskId='1'
Source='bin\Service.exe'
KeyPath='yes'
Vital="yes"/>
<ServiceInstall Id="ServiceInstaller"
Type="ownProcess"
Name="Service"
DisplayName="Service"
Description="A Service"
Start="auto"
ErrorControl="normal"
/>
<ServiceControl Id="ServiceControl"
Start="install"
Stop="both"
Remove="uninstall"
Name="Service"
Wait="yes" />
</Component>
Имя пользователя для ServiceInstall
должен быть полностью квалифицирован:
NT AUTHORITY\NetworkService
NT AUTHORITY\LocalService
NT AUTHORITY\SYSTEM
Я бы использовал этот фрагмент для.wxs-файла
<?xml version="1.0" encoding="UTF-8"?>
<?define ProductVersion="1.0.0.0" ?>
<?define UpgradeCode="{YOURGUID}" ?>
<?define Manufacturer="SetupWinService" ?>
<?define ProductName="WcfServiceHost" ?>
<?define SkuName="WcfServiceHost" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*"
Name="$(var.ProductName)"
Language="1049"
Version="$(var.ProductVersion)"
Manufacturer="$(var.Manufacturer)"
UpgradeCode="$(var.UpgradeCode)">
<!-- do you really need 200? i'd try at least 301 -->
<Package InstallerVersion="301"
Compressed="yes"
Languages="1049"
InstallPrivileges="elevated"
SummaryCodepage="1251"
Platform="x86" />
<Media Id="1"
Cabinet="$(var.SkuName).cab"
EmbedCab="yes" />
<Directory Id="TARGETDIR"
Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="ProductDirectory"
Name="$(var.ProductName)" />
</Directory>
</Directory>
<ComponentGroup Id="MainComponentGroup">
<Component Directory="ProductDirectory">
<File Name="$(var.**Project**.TargetFileName)"
Source="$(var.**Project**.TargetPath)"
KeyPath="yes"
Vital="yes" />
<ServiceInstall Id="SeviceInstall"
Name="$(var.ProductName)"
DisplayName="$(var.ProductName)"
Type="ownProcess"
Interactive="no"
Start="auto"
Vital="yes"
ErrorControl="normal"
Account="LOCALSYSTEM">
</ServiceInstall>
<ServiceControl Id="ServiceControl_Start"
Name="$(var.ProductName)"
Start="install"
Wait="no" />
<ServiceControl Id="ServiceControl_Stop"
Name="$(var.ProductName)"
Stop="both"
Remove="uninstall"
Wait="yes" />
</Component>
<Component Directory="ProductDirectory">
<File Name="App.config"
Source="$(var.**Project**.TargetDir)\app.config"
Vital="yes" />
</Component>
</ComponentGroup>
<Feature Id="MainFeature"
Level="1">
<ComponentGroupRef Id="MainComponentGroup" />
</Feature>
<!-- added automatic upgrading -->
<Upgrade Id="$(var.UpgradeCode)">
<UpgradeVersion Property="UPGRADEFOUND"
Minimum="0.0.0.1" IncludeMinimum="yes"
Maximum="$(var.ProductVersion)" IncludeMaximum="yes"
OnlyDetect="no"
IgnoreRemoveFailure="yes"
MigrateFeatures="yes"/>
</Upgrade>
<InstallExecuteSequence>
<InstallExecute Before="RemoveExistingProducts" />
<RemoveExistingProducts Before="InstallFinalize" />
</InstallExecuteSequence>
</Product>
</Wix>
С этим основным System.ServiceProcess.ServiceBase
-внедрение (которое на самом деле не отличается от вашего)
public partial class Service : ServiceBase
{
public Service()
{
this.InitializeComponent();
}
public static void Main()
{
Run(new Service());
}
#region Service Commands
protected override void OnStart(string[] args)
{
}
protected override void OnStop()
{
}
protected override void OnPause()
{
this.OnStop();
}
#endregion
}
С этим фрагментом я получил демо-проект для работы...
Доступен полностью работающий демонстрационный проект - если это не помогло, пожалуйста, измените код, чтобы я мог воспроизвести Вашу проблему!
У меня была эта ошибка на некоторых компьютерах. Один и тот же исполняемый файл работает на некоторых и дает эту ошибку на других.
Помогает обновление.NET 1.1/2.0/3.0 на этих компьютерах (у меня это работало на Windows XP, 7 и 8.1).