服务错误 1053:无法及时启动
Service Error 1053: Could not start in timely fashion
在你问之前,是的,我在这个问题上搜索了又搜索,尝试了其他人为他们所做的工作,但一无所获。我试过:
- 运行 处于发布模式
- 运行 在 LocalSystem、LocalService 和指定帐户上
- 我的项目中没有调试代码
我的项目摘要是一个 Windows 服务,它在设定的时间扫描源文件夹中的文件,转换它们并将它们放在目标文件夹中。这些设置可以在 GUI 中更改,GUI 会更改服务定期扫描的 XML 文件。
成品包装在InstallShield中。一切都在 VisualStudio 中运行。我可以安装该程序并且 服务完美运行 。当我使用我的发布版本并将其安装在同一台机器上时,我收到此 1053 错误。
这是我的 OnStart
protected override void OnStart(string[] args)
{
// Update the service state to Start Pending.
ServiceStatus serviceStatus = new ServiceStatus();
serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING;
serviceStatus.dwWaitHint = 100000;
SetServiceStatus( this.ServiceHandle, ref serviceStatus );
// Set up a timer to trigger every 30s
System.Threading.Thread t1 = new System.Threading.Thread( new System.Threading.ThreadStart( this.InitTimer ) );
t1.Start();
// Set folders and time from xml
System.Threading.Thread t2 = new System.Threading.Thread( new System.Threading.ThreadStart( this.InitSettings ) );
t2.Start();
// Update the service state to Running.
eventLog1.WriteEntry( "Service successfully started", EventLogEntryType.Information, eventId++ );
serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING;
SetServiceStatus( this.ServiceHandle, ref serviceStatus );
}
这是我的主要内容
public WTVService(string[] args)
{
InitializeComponent();
string eventSourceName = "Searcher";
string logName = "WTVConverter";
if ( args.Count() > 0 )
{
eventSourceName = args[0];
}
if ( args.Count() > 1 )
{
logName = args[1];
}
eventLog1 = new EventLog();
if ( !EventLog.SourceExists( eventSourceName ) )
{
EventLog.CreateEventSource( eventSourceName, logName );
}
eventLog1.Source = eventSourceName; eventLog1.Log = logName;
}
让我知道其他可能有用的信息。
编辑:此外,如果它有所不同,错误会立即出现,而不是在假定的 30 秒超时规则之后。
这很有趣。我确定 InstallShield 人群在这里有点受限,但这可能会对某些人有所帮助。最终起作用的是 将构建模式从 SingleImage 更改为 DVD-5。我不能说为什么,但它现在工作得很好。我在一台机器上测试过 运行 我的程序并且一切正常。
当您通过 InstallShield 部署任何服务时,您需要 select LocalSystem 用户名或管理员用户凭据。
要执行任何 windows 服务,需要 Admin 用户或 LocalSystem 用户。
因此 InstallShield 中的服务提供了用户凭据。
在你问之前,是的,我在这个问题上搜索了又搜索,尝试了其他人为他们所做的工作,但一无所获。我试过:
- 运行 处于发布模式
- 运行 在 LocalSystem、LocalService 和指定帐户上
- 我的项目中没有调试代码
我的项目摘要是一个 Windows 服务,它在设定的时间扫描源文件夹中的文件,转换它们并将它们放在目标文件夹中。这些设置可以在 GUI 中更改,GUI 会更改服务定期扫描的 XML 文件。
成品包装在InstallShield中。一切都在 VisualStudio 中运行。我可以安装该程序并且 服务完美运行 。当我使用我的发布版本并将其安装在同一台机器上时,我收到此 1053 错误。
这是我的 OnStart
protected override void OnStart(string[] args)
{
// Update the service state to Start Pending.
ServiceStatus serviceStatus = new ServiceStatus();
serviceStatus.dwCurrentState = ServiceState.SERVICE_START_PENDING;
serviceStatus.dwWaitHint = 100000;
SetServiceStatus( this.ServiceHandle, ref serviceStatus );
// Set up a timer to trigger every 30s
System.Threading.Thread t1 = new System.Threading.Thread( new System.Threading.ThreadStart( this.InitTimer ) );
t1.Start();
// Set folders and time from xml
System.Threading.Thread t2 = new System.Threading.Thread( new System.Threading.ThreadStart( this.InitSettings ) );
t2.Start();
// Update the service state to Running.
eventLog1.WriteEntry( "Service successfully started", EventLogEntryType.Information, eventId++ );
serviceStatus.dwCurrentState = ServiceState.SERVICE_RUNNING;
SetServiceStatus( this.ServiceHandle, ref serviceStatus );
}
这是我的主要内容
public WTVService(string[] args)
{
InitializeComponent();
string eventSourceName = "Searcher";
string logName = "WTVConverter";
if ( args.Count() > 0 )
{
eventSourceName = args[0];
}
if ( args.Count() > 1 )
{
logName = args[1];
}
eventLog1 = new EventLog();
if ( !EventLog.SourceExists( eventSourceName ) )
{
EventLog.CreateEventSource( eventSourceName, logName );
}
eventLog1.Source = eventSourceName; eventLog1.Log = logName;
}
让我知道其他可能有用的信息。
编辑:此外,如果它有所不同,错误会立即出现,而不是在假定的 30 秒超时规则之后。
这很有趣。我确定 InstallShield 人群在这里有点受限,但这可能会对某些人有所帮助。最终起作用的是 将构建模式从 SingleImage 更改为 DVD-5。我不能说为什么,但它现在工作得很好。我在一台机器上测试过 运行 我的程序并且一切正常。
当您通过 InstallShield 部署任何服务时,您需要 select LocalSystem 用户名或管理员用户凭据。
要执行任何 windows 服务,需要 Admin 用户或 LocalSystem 用户。
因此 InstallShield 中的服务提供了用户凭据。