C++ 检测dll是否加载到服务中

C++ 检测dll是否加载到服务中,c++,winapi,C++,Winapi,是否有windows api来检测我的dll是否在系统服务或正常用户进程中运行 之前,我只是查看当前用户名,而忽略了系统、本地服务和网络服务。但现在我看到了GetUsername返回machine_name$,在某些情况下,svchost会在任何人登录之前运行。 此外,我无法从vista中的GetUsername中找到任何有关机器名称$result的文档,有人看到过这种行为吗?这是用于配置服务的任何用户帐户。可以是任何东西,由系统管理员选择这些帐户。这当然意味着您不能可靠地使用它来检测代码是否在

是否有windows api来检测我的dll是否在系统服务或正常用户进程中运行

之前,我只是查看当前用户名,而忽略了系统、本地服务和网络服务。但现在我看到了GetUsername返回machine_name$,在某些情况下,svchost会在任何人登录之前运行。
此外,我无法从vista中的GetUsername中找到任何有关机器名称$result的文档,有人看到过这种行为吗?

这是用于配置服务的任何用户帐户。可以是任何东西,由系统管理员选择这些帐户。这当然意味着您不能可靠地使用它来检测代码是否在服务中运行


您应该让使用DLL的服务告诉您它是一个服务,它总是知道。自动检测很棘手,GetProcessWindowsStation应该是一个线索。使用UOI_标志在返回的句柄上调用GetUserObjectInformation,并检查是否让USEROBJECTFLAGS.dwFlags=WSF_可见。我认为RDP可能会出现一些退化情况,但您可以查看用户是否有机会看到进程输出。

您可以查看进程令牌,查看已知的SID NT Authority\服务是否在令牌中处于活动状态。如果是,那么您正在运行服务。您可以使用CheckTokenMembership查看您的进程是否在令牌中使用特定的活动SID运行。

正如其他答案所述,检查当前用户名是非常不可靠的。服务可以设置为使用任何帐户,甚至包括真实用户的帐户

我在过去研究过一个类似的问题:可执行文件能否确定它是作为服务运行还是作为普通程序运行?那里的结论似乎是没有官方的方式来判断。我发现唯一合理可靠的方法是检查服务程序启动时必须调用的功能之一的成功或失败。显然,该技术不适用于服务所使用的dll


所以据我所知,dll并没有很好的方法来自行确定这一点。或者需要宿主程序告诉dll。否则,您需要重新检查您的设计。为什么dll实际上需要知道这一点?还有没有其他方法可以让它工作,这样它就不需要知道了?

您可以尝试调用StartServiceCtrlDispatcher函数查看并检查错误代码。在服务内部,可能是错误服务已在运行。

对于Windows Vista及更高版本,可以将当前会话作为服务加载到会话0中,并将用户进程加载到会话1及更高版本中。我还没有测试过,但类似的东西应该可以工作:

if (Win32MajorVersion < 6) return PROCESSTYPE_CANNOTDETECT;

DWORD SessionId;
if ( ProcessIdToSessionId( GetCurrentProcessId(), &SessionId ) 
  && (0 == SessionId) )
{
    return PROCESSTYPE_SERVICE_OR_DRIVER;
}
else
{
    return PROCESSTYPE_USERAPP;
}

除此之外,还可以将服务配置为以任何用户的身份运行。用户名不会告诉您该程序是否为服务。问题是当作为本地系统运行时,允许服务与桌面交换机交互。如果设置了此开关,服务将在Session0/WinSta0下运行,该开关将此标志WSF_VISIBLE设置为1。