我已成功安装了几个其他自定义.Net Windows服务.我最近编写的一个新版本与其他版本非常相似,并且安装时没有错误 - 在启动它时,服务控制器无法启动错误对话框:系统错误2 ...系统无法找到指定的文件.
经过一段时间和惊愕之后,我唯一想到的就是这个服务的唯一不同之处在于路径和可执行文件名称比我的其他任何服务都长至少10个字符.在缩短路径和.exe名称并重新安装时,服务运行良好:没有错误!我只能假设我以前的路径或服务或.exe名称太长.
另外,有必要提一下我使用了一些内置于我的exe中的"服务驱动程序"代码来处理通过win API调用向服务控制器安装/卸载服务.可能是该服务驱动程序模块中隐藏的字符限制.
我找不到任何与Windows相关的文档来确认是否存在我已超出的路径或服务名称的系统限制字符限制.我会在时间允许的情况下深入了解服务驱动程序,看看是否有问题.同时我欢迎任何见解.
我正在使用批处理文件来停止Windows服务.我正在使用该sc命令,但考虑到下面的问题,我对其他想法持开放态度.问题是,该批处理文件收益,而该服务停止(该stop参数sc似乎只要求停止-它不能等待为止损).
我怎样才能修改该批处理文件无法继续,直到停止是完整的?
我正在尝试Topshelf.Host使用以下代码停止本地计算机上的Windows服务(该服务,如果这很重要):
serviceController.Stop();
serviceController.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
Run Code Online (Sandbox Code Playgroud)
timeout设置为1小时,但服务实际上从未停止过.奇怪的是,从服务MMC管理单元中我首先看到它处于"停止"状态,但过了一段时间它又恢复为"已启动"状态.但是,当我尝试手动停止时,会发生错误:
Windows could not stop the Topshelf.Host service on Local Computer.
Error 1061: The service cannot accept control messages at this time.
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
我正在尝试控制安装在远程计算机中的Windows服务.我正在ServiceController上课.
我有这个:
ServiceController svc = new ServiceController("MyWindowsService", "COMPUTER_NAME");
Run Code Online (Sandbox Code Playgroud)
有了这个,我可以像这样得到Windows服务的状态:
string status = svc.Status.ToString();
Run Code Online (Sandbox Code Playgroud)
但我无法控制Windows服务(通过执行svc.Start();或svc.Stop();).我得到以下异常:
无法在计算机'COMPUTER_NAME'上打开Servicexxx服务
这是正常的,我想这与访问权限有关.但是怎么样?我看过谷歌但没找到我想要的东西.但是我经常阅读与假冒相关的内容,但我不知道这意味着什么.
注意:本地和远程计算机都运行Win XP Pro.
我必须在.Net Admin应用程序中获取Windows服务的绝对路径.我正在使用.Net的ServiceController,如下所示.
ServiceController serviceController = new ServiceController(serviceName);
Run Code Online (Sandbox Code Playgroud)
但我在这里看不到任何属性来获取服务的.exe的绝对路径.无论如何以编程方式获得此功能.
我有一个由服务和可执行文件组成的应用程序.本质上,它是一个表单应用程序,负责在特定情况下启动和停止服务.
在Windows XP上,应用程序使用以下代码管理此项:
ServiceController controller = new ServiceController();
controller.MachineName = ".";
controller.ServiceName = "XXXXXXXXXX";
controller.Stop();
controller.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 10));
controller.Start();
Run Code Online (Sandbox Code Playgroud)
但是在Windows 7上,即使我以管理员身份启动了应用程序,我也会遇到以下异常:
System.InvalidOperationException: Cannot open XXXXXXXXXXXXX service on computer '.'. ---> System.ComponentModel.Win32Exception: Access is denied
--- End of inner exception stack trace ---
at System.ServiceProcess.ServiceController.GetServiceHandle(Int32 desiredAccess)
at System.ServiceProcess.ServiceController.Start(String[] args)
at System.ServiceProcess.ServiceController.Start()
Run Code Online (Sandbox Code Playgroud)
有什么我可以通过编程方式解决这个问题吗?
我试过System.ServiceProcess.ServiceController System.Diagnostics.Process;
在我的Web表单中控制Windows服务.随着System.ServiceProcess.ServiceController我获得访问被拒绝的例外.
随着System.Diagnostics.Process我什么也没得到.如何使用我的网络表单启动/停止Windows服务,任何想法?
在System.ServiceProcess命名空间中,是否有任何类型的枚举或其他直接成员来确定服务的启动类型(自动,延迟自动,按需,禁用)ServiceController?
我的想法是使用.NET框架类库的该命名空间(或其他命名空间)的可用成员来确定该事物,而不是查看操作系统注册表或WMI以获取服务的启动类型,因为我可以这样做,我我只是问.NET框架是否公开了一种更简单的方法来确定那件事.
用VB.Net编写的伪代码,但我也可以管理C#方法:
Public Shared Function GetStartType(ByVal svcName As String) As ServiceControllerStatus
Dim svc As ServiceController = (From service As ServiceController In ServiceController.GetServices()
Where service.ServiceName.Equals(svcName, StringComparison.OrdinalIgnoreCase)
).FirstOrDefault
If svc Is Nothing Then
Throw New ArgumentException("Any service found with the specified name.", "svcName")
Else
Using svc
' Note that StartTypeEnumValue does not exists.
Return svc.StartTypeEnumValue
End Using
End If
End Function
Run Code Online (Sandbox Code Playgroud) 我有一个.NET MVC3应用程序,该应用程序需要能够打开和关闭远程服务。为此,我通过WindowsIdentity.Impersonate()模拟了一个特定的用户帐户。要测试用户的权限,我可以以用户身份登录并sc.exe \\[server] start [service]在命令提示符下执行。我还知道模仿命令可以按预期工作,因为该应用程序以匿名方式运行,因此无法在.没有模仿的情况下控制本地计算机()上的服务,但可以通过模仿来控制本地服务。但是,当我将它们放在一起并尝试启动远程服务而不是本地服务时,总是出现错误“无法[service]在计算机' [server]' 上打开服务”
有没有人遇到过类似的问题?我一直以为它是服务器配置而不是.NET问题,直到我意识到sc.exe可以正常工作。这是我正在使用的类的缩写版本:
public class Service
{
public string Name;
public bool Running;
private ServiceController serviceController;
public Service(string name, string host)
{
Name = name;
serviceController = new ServiceController(Name, host);
Running = serviceController.Status == ServiceControllerStatus.Running;
}
public bool StartService()
{
ServiceControllerPermission scp = new ServiceControllerPermission(ServiceControllerPermissionAccess.Control, serviceController.MachineName, Name);
scp.Assert();
serviceController.Start();
serviceController.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 5));
serviceController.Refresh();
Running = serviceController.Status == ServiceControllerStatus.Running;
return Running;
}
} …Run Code Online (Sandbox Code Playgroud) 所以ServiceController.WaitForStatus是一个阻塞调用.如何才能完成任务/异步方式?