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 6848
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: Faith0G |
last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome former...
|
by: ryjfgjl |
last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
|
by: taylorcarr |
last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
|
by: ryjfgjl |
last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
|
by: BarryA |
last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
|
by: nemocccc |
last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
|
by: Sonnysonu |
last post by:
This is the data of csv file
1 2 3
1 2 3
1 2 3
1 2 3
2 3
2 3
3
the lengths should be different i have to store the data by column-wise with in the specific length.
suppose the i have to...
|
by: Hystou |
last post by:
There are some requirements for setting up RAID:
1. The motherboard and BIOS support RAID configuration.
2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
| |