Joh*_*nny 15 .net c# windows-services
谁能帮助我知道如何获得Windows服务的PID?
我需要获取PID才能运行以下命令:
Process.Start(new ProcessStartInfo
{
Filename = "cmd.exe",
CreateNoWindow = true,
UseShellExecute = false,
Arguments = string.Format("/c taskkill /pid {0} /f", pidnumber)
});
Run Code Online (Sandbox Code Playgroud)
Chr*_*n.K 27
另一个答案忽略的是,单个进程也可以托管多个自治服务.这个svchost.exe过程的多个实例,每个实例都有几个服务,就是最好的例子.
因此,一般来说,通过杀死它的托管进程来尝试杀死任意服务是绝对不安全的(我认为这是你尝试做的,因为你提到taskkill.exe).您可以在此过程中删除多个不相关的服务.
如果您确实知道服务的流程只托管您关心的服务,那么您可以在他/她的答案中选择@MC建议的策略.
另外,您还可以使用ServiceController的类打开的句柄,你的服务,然后使用它(通过ServiceHandle属性)到的P/Invoke的QueryServiceStatusEx功能找到你想知道进程的ID.
如果您需要更多细节,您应该澄清您实际想要实现的目标.你的问题并不清楚.
更新这里是我从现有项目中删除的一些代码,它们可以执行您想要的操作,前提是您有一个ServiceController实例._如上所述,请小心使用!__
[StructLayout(LayoutKind.Sequential)]
internal sealed class SERVICE_STATUS_PROCESS
{
[MarshalAs(UnmanagedType.U4)]
public uint dwServiceType;
[MarshalAs(UnmanagedType.U4)]
public uint dwCurrentState;
[MarshalAs(UnmanagedType.U4)]
public uint dwControlsAccepted;
[MarshalAs(UnmanagedType.U4)]
public uint dwWin32ExitCode;
[MarshalAs(UnmanagedType.U4)]
public uint dwServiceSpecificExitCode;
[MarshalAs(UnmanagedType.U4)]
public uint dwCheckPoint;
[MarshalAs(UnmanagedType.U4)]
public uint dwWaitHint;
[MarshalAs(UnmanagedType.U4)]
public uint dwProcessId;
[MarshalAs(UnmanagedType.U4)]
public uint dwServiceFlags;
}
internal const int ERROR_INSUFFICIENT_BUFFER = 0x7a;
internal const int SC_STATUS_PROCESS_INFO = 0;
[DllImport("advapi32.dll", SetLastError = true)]
internal static extern bool QueryServiceStatusEx(SafeHandle hService, int infoLevel, IntPtr lpBuffer, uint cbBufSize, out uint pcbBytesNeeded);
public static int GetServiceProcessId(this ServiceController sc)
{
if (sc == null)
throw new ArgumentNullException("sc");
IntPtr zero = IntPtr.Zero;
try
{
UInt32 dwBytesNeeded;
// Call once to figure the size of the output buffer.
QueryServiceStatusEx(sc.ServiceHandle, SC_STATUS_PROCESS_INFO, zero, 0, out dwBytesNeeded);
if (Marshal.GetLastWin32Error() == ERROR_INSUFFICIENT_BUFFER)
{
// Allocate required buffer and call again.
zero = Marshal.AllocHGlobal((int)dwBytesNeeded);
if (QueryServiceStatusEx(sc.ServiceHandle, SC_STATUS_PROCESS_INFO, zero, dwBytesNeeded, out dwBytesNeeded))
{
var ssp = new SERVICE_STATUS_PROCESS();
Marshal.PtrToStructure(zero, ssp);
return (int)ssp.dwProcessId;
}
}
}
finally
{
if (zero != IntPtr.Zero)
{
Marshal.FreeHGlobal(zero);
}
}
return -1;
}
Run Code Online (Sandbox Code Playgroud)
假设您知道服务使用的EXE的名称,并且只有其中一个:
int procID = Process.GetProcessesByName("yourservice")[0].Id;
Run Code Online (Sandbox Code Playgroud)
该方法Process.GetProcessesByName("yourservice")返回一个具有指定名称的进程数组,因此如果您不知道"yourservice.exe"运行多少运行,则可能需要一个foreach循环.
| 归档时间: |
|
| 查看次数: |
9337 次 |
| 最近记录: |