Hi.
I am working on a managed dll.
What code can I use in C# to detect if my dll is running under a
service (like IIS) or called from a 'normal' program.
Thanks
Thierry 3 6845
Check the value of the System.Environment.UserName property. If it is a
non-user account, such as "SYSTEM" or "Network", then it is safe to assume
that the process is running as a service.
Good luck,
Derek Stone
EliteVB.com
"Thierry" <no**@none.com> wrote in message
news:e5**************@TK2MSFTNGP09.phx.gbl... Hi.
I am working on a managed dll. What code can I use in C# to detect if my dll is running under a service (like IIS) or called from a 'normal' program.
Thanks
Thierry
That is not necessarily correct because the user could change the identity
that the service is running under.
The problem is that a service is nothing more than an executable. Here are
a couple things that you might try. I have not actually done these but they
make logical sense if you can get them to work.
1) All services inherit from ServiceBase. You might check the call stack
to see if the very first method called belonged to a class that inherited
from ServiceBase.
2) Or you could use the ServiceController to get the names of all services
registered in the system and compare them with your application. If there
is a match, you may be running in a service. This is not perfect I guess
since it might be possible to have a service and a regular application with
the same name.
"Derek Stone" <ds****@elitevb.com> wrote in message
news:#$**************@TK2MSFTNGP11.phx.gbl... Check the value of the System.Environment.UserName property. If it is a non-user account, such as "SYSTEM" or "Network", then it is safe to assume that the process is running as a service.
Good luck, Derek Stone EliteVB.com
"Thierry" <no**@none.com> wrote in message news:e5**************@TK2MSFTNGP09.phx.gbl... Hi.
I am working on a managed dll. What code can I use in C# to detect if my dll is running under a service (like IIS) or called from a 'normal' program.
Thanks
Thierry
-
[DllImport("advapi32.dll", CharSet=System.Runtime.InteropServices.CharSet.Unicode, SetLastError=true)]
-
private extern static IntPtr OpenSCManager(string machineName, string databaseName, int access);
-
-
[DllImport("advapi32.dll",SetLastError=true, CharSet=CharSet.Auto)]
-
private static extern bool EnumServicesStatusEx(IntPtr hSCManager,
-
int InfoLevel, int dwServiceType,
-
int dwServiceState, IntPtr lpServices, UInt32 cbBufSize,
-
out uint pcbBytesNeeded, out uint lpServicesReturned,
-
ref uint lpResumeHandle, string pszGroupName);
-
-
[DllImport("advapi32.dll")]
-
private static extern bool CloseServiceHandle(IntPtr hSCObject);
-
-
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
-
private static extern int GetCurrentProcessId();
-
-
[StructLayout(LayoutKind.Sequential, Pack=1)]
-
public struct ENUM_SERVICE_STATUS_PROCESS
-
{
-
public static readonly int SizeOf = Marshal.SizeOf(typeof(ENUM_SERVICE_STATUS_PROCESS));
-
-
[MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)]
-
public string pServiceName;
-
-
[MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)]
-
public string pDisplayName;
-
-
public SERVICE_STATUS_PROCESS ServiceStatus;
-
}
-
-
[StructLayout(LayoutKind.Sequential, Pack=1)]
-
public struct SERVICE_STATUS_PROCESS
-
{
-
public static readonly int SizeOf = Marshal.SizeOf(typeof(SERVICE_STATUS_PROCESS));
-
-
public int dwServiceType;
-
public int dwCurrentState;
-
public int dwControlsAccepted;
-
public int dwWin32ExitCode;
-
public int dwServiceSpecificExitCode;
-
public int dwCheckPoint;
-
public int dwWaitHint;
-
public int dwProcessId;
-
public int dwServiceFlags;
-
}
-
-
// http://www.hoytsoft.org/sourceFile.aspx?zip=files/HoytSoft.ServiceProcess_src(Rev3).zip&source=Service%20Base/ServicesAPI.cs
-
private const int SERVICE_NO_CHANGE = -1;
-
private const int STANDARD_RIGHTS_REQUIRED = 0xF0000;
-
private const int SC_ENUM_PROCESS_INFO = 0;
-
-
private enum ServiceType { SERVICE_KERNEL_DRIVER = 0x1, SERVICE_FILE_SYSTEM_DRIVER = 0x2, SERVICE_WIN32_OWN_PROCESS = 0x10, SERVICE_WIN32_SHARE_PROCESS = 0x20, SERVICE_INTERACTIVE_PROCESS = 0x100, SERVICETYPE_NO_CHANGE = SERVICE_NO_CHANGE, SERVICE_WIN32 = (SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS) }
-
private enum ServiceStartType { SERVICE_BOOT_START = 0x0, SERVICE_SYSTEM_START = 0x1, SERVICE_AUTO_START = 0x2, SERVICE_DEMAND_START = 0x3, SERVICE_DISABLED = 0x4, SERVICESTARTTYPE_NO_CHANGE = SERVICE_NO_CHANGE }
-
private enum ServiceErrorControl { SERVICE_ERROR_IGNORE = 0x0, SERVICE_ERROR_NORMAL = 0x1, SERVICE_ERROR_SEVERE = 0x2, SERVICE_ERROR_CRITICAL = 0x3, msidbServiceInstallErrorControlVital = 0x8000, SERVICEERRORCONTROL_NO_CHANGE = SERVICE_NO_CHANGE }
-
private enum ServiceStateRequest { SERVICE_ACTIVE = 0x1, SERVICE_INACTIVE = 0x2, SERVICE_STATE_ALL = (SERVICE_ACTIVE | SERVICE_INACTIVE) }
-
private enum ServiceControlType { SERVICE_CONTROL_STOP = 0x1, SERVICE_CONTROL_PAUSE = 0x2, SERVICE_CONTROL_CONTINUE = 0x3, SERVICE_CONTROL_INTERROGATE = 0x4, SERVICE_CONTROL_SHUTDOWN = 0x5, SERVICE_CONTROL_PARAMCHANGE = 0x6, SERVICE_CONTROL_NETBINDADD = 0x7, SERVICE_CONTROL_NETBINDREMOVE = 0x8, SERVICE_CONTROL_NETBINDENABLE = 0x9, SERVICE_CONTROL_NETBINDDISABLE = 0xA, SERVICE_CONTROL_DEVICEEVENT = 0xB, SERVICE_CONTROL_HARDWAREPROFILECHANGE = 0xC, SERVICE_CONTROL_POWEREVENT = 0xD, SERVICE_CONTROL_SESSIONCHANGE = 0xE, }
-
private enum ServiceState { SERVICE_STOPPED = 0x1, SERVICE_START_PENDING = 0x2, SERVICE_STOP_PENDING = 0x3, SERVICE_RUNNING = 0x4, SERVICE_CONTINUE_PENDING = 0x5, SERVICE_PAUSE_PENDING = 0x6, SERVICE_PAUSED = 0x7 }
-
private enum ServiceControlAccepted { SERVICE_ACCEPT_STOP = 0x1, SERVICE_ACCEPT_PAUSE_CONTINUE = 0x2, SERVICE_ACCEPT_SHUTDOWN = 0x4, SERVICE_ACCEPT_PARAMCHANGE = 0x8, SERVICE_ACCEPT_NETBINDCHANGE = 0x10, SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 0x20, SERVICE_ACCEPT_POWEREVENT = 0x40, SERVICE_ACCEPT_SESSIONCHANGE = 0x80 }
-
private enum ServiceControlManagerType { SC_MANAGER_CONNECT = 0x1, SC_MANAGER_CREATE_SERVICE = 0x2, SC_MANAGER_ENUMERATE_SERVICE = 0x4, SC_MANAGER_LOCK = 0x8, SC_MANAGER_QUERY_LOCK_STATUS = 0x10, SC_MANAGER_MODIFY_BOOT_CONFIG = 0x20, SC_MANAGER_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE | SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_LOCK | SC_MANAGER_QUERY_LOCK_STATUS | SC_MANAGER_MODIFY_BOOT_CONFIG }
-
private enum ACCESS_TYPE { SERVICE_QUERY_CONFIG = 0x1, SERVICE_CHANGE_CONFIG = 0x2, SERVICE_QUERY_STATUS = 0x4, SERVICE_ENUMERATE_DEPENDENTS = 0x8, SERVICE_START = 0x10, SERVICE_STOP = 0x20, SERVICE_PAUSE_CONTINUE = 0x40, SERVICE_INTERROGATE = 0x80, SERVICE_USER_DEFINED_CONTROL = 0x100, SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL }
-
-
public static bool IsCurrentProcessAService()
-
{
-
return IsProcessAService(GetCurrentProcessId());
-
}
-
-
//public static bool IsProcessAService(int processId)
-
public static bool IsProcessAService(int processId)
-
{
-
IntPtr handle = IntPtr.Zero;
-
IntPtr buf = IntPtr.Zero;
-
try
-
{
-
handle = OpenSCManager(null, null, (int)ServiceControlManagerType.SC_MANAGER_ALL_ACCESS);
-
if(handle != IntPtr.Zero)
-
{
-
uint iBytesNeeded = 0;
-
uint iServicesReturned = 0;
-
uint iResumeHandle = 0;
-
-
ENUM_SERVICE_STATUS_PROCESS infoLevel = new ENUM_SERVICE_STATUS_PROCESS();
-
if(!EnumServicesStatusEx(handle, SC_ENUM_PROCESS_INFO, (int)ServiceType.SERVICE_WIN32, (int)ServiceStateRequest.SERVICE_STATE_ALL, IntPtr.Zero, 0, out iBytesNeeded, out iServicesReturned, ref iResumeHandle, null))
-
{
-
buf = Marshal.AllocHGlobal((int)iBytesNeeded);
-
if(!EnumServicesStatusEx(handle, SC_ENUM_PROCESS_INFO, (int)ServiceType.SERVICE_WIN32, (int)ServiceStateRequest.SERVICE_STATE_ALL, buf, iBytesNeeded, out iBytesNeeded, out iServicesReturned, ref iResumeHandle, null))
-
throw new Win32Exception(Marshal.GetLastWin32Error());
-
-
ENUM_SERVICE_STATUS_PROCESS serviceStatus;
-
int iPtr = buf.ToInt32();
-
for(int i = 0; i < (int)iServicesReturned; i++)
-
{
-
serviceStatus = (ENUM_SERVICE_STATUS_PROCESS)Marshal.PtrToStructure(new IntPtr(iPtr), typeof(ENUM_SERVICE_STATUS_PROCESS));
-
-
//System.Console.WriteLine("{0} - {1}", serviceStatus.pServiceName, serviceStatus.ServiceStatus.dwProcessId);
-
-
if(serviceStatus.ServiceStatus.dwProcessId == processId)
-
return true;
-
-
iPtr += ENUM_SERVICE_STATUS_PROCESS.SizeOf;
-
}
-
}
-
}
-
-
return false;
-
}
-
finally
-
{
-
if(handle != IntPtr.Zero)
-
CloseServiceHandle(handle);
-
-
if(buf != IntPtr.Zero)
-
Marshal.FreeHGlobal(buf);
-
}
-
}
-
This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Max Berghammer |
last post by:
Hi !
Is there any way to redirect the standard-outputstream or
standard-errorstream of the currently running process ? I know that i can
spawn a new process and redirect its standard-outputstream...
|
by: Regis Melo |
last post by:
Hello,
I'm trying to get the "EXE" name of app that runs the current
window. To get the current window I use:
private static extern
int GetForegroundWindow();
|
by: Jean-Pierre Fouche |
last post by:
I have a server app which hosts a remote object, published via http.
The app works fine as a self-standing .exe.
However, when I host the same code as a library .dll, the object is
unavailable...
|
by: Thierry |
last post by:
Hi.
I am working on a managed dll.
What code can I use in C# to detect if my dll is running under a
service (like IIS) or called from a 'normal' program.
Thanks
Thierry
|
by: Sharon |
last post by:
How do I find the full path where my current process is executed from?
System.Environment.CurrentDirectory and
System.IO.Directory.GetCurrentDirectory is not good enough because they may
be...
|
by: Maciej Bliziński |
last post by:
Hello Pythonists,
I'd like to write for myself a tiny program that counts time spent on each
virtual desktop (in GNOME). In order to do that, I need my program to
detect the current virtual...
|
by: wheels619 |
last post by:
Hi,
I need the directory of a running process or service's executable. Any
ideas how to do this?
I looked up some Win APIs but none to accomplish this task.
I noticed there is a ...
|
by: Maxwell2006 |
last post by:
Hi,
How can I get a list of AppDomains under the current process?
Thank you,
|
by: PRR |
last post by:
Here is a code i found on "how to enumerate appdomains in a current process".
The original code was posted by Thomas Scheidegger
Add the following as a COM reference -...
|
by: DolphinDB |
last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation.
Take...
|
by: DolphinDB |
last post by:
Tired of spending countless mintues downsampling your data? Look no further!
In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
|
by: ryjfgjl |
last post by:
ExcelToDatabase: batch import excel into database automatically...
|
by: isladogs |
last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM).
In this month's session, we are pleased to welcome back...
|
by: Vimpel783 |
last post by:
Hello!
Guys, I found this code on the Internet, but I need to modify it a little. It works well, the problem is this: Data is sent from only one cell, in this case B5, but it is necessary that data...
|
by: jfyes |
last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
|
by: PapaRatzi |
last post by:
Hello,
I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
|
by: Defcon1945 |
last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
|
by: af34tf |
last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
| |