我用 Delphi 编写了一个服务,它是一个简单的作业调度程序,例如运行查询或运行UI软件或检查冻结等。一切都在一台PC上工作,但我需要在服务器上安装该服务,并管理所有登录的用户。有些作业可以为所有用户运行,但有些作业不能为某些用户运行,而为其他用户运行。我已经尝试了GetUserName()和其他东西,我发现在这里,但当我试图获得当前用户的服务,我得到SYSTEM。我读到的服务安装为管理员,这是正确的,但我如何才能获得登录的用户,并确保运行正确的用户的作业?
GetUserName()
SYSTEM
r1zhe5dt1#
服务和每个登录的用户在单独的终端会话中运行。GetUserName()获取它被调用的会话的用户名。这就是为什么在服务会话中调用时会看到SYSTEM。该服务可以使用WTS API枚举活动用户会话(WTSEnumerateSessions())并从它们获取信息(WTSQuerySessionInformation()),例如它们的用户名。要在特定用户会话中运行外部进程,服务可以使用WTSQueryUserToken()获取会话的用户令牌,然后使用CreateProcessAsUser()以该用户身份运行该进程。
WTSEnumerateSessions()
WTSQuerySessionInformation()
WTSQueryUserToken()
CreateProcessAsUser()
1条答案
按热度按时间r1zhe5dt1#
服务和每个登录的用户在单独的终端会话中运行。
GetUserName()
获取它被调用的会话的用户名。这就是为什么在服务会话中调用时会看到SYSTEM
。该服务可以使用WTS API枚举活动用户会话(
WTSEnumerateSessions()
)并从它们获取信息(WTSQuerySessionInformation()
),例如它们的用户名。要在特定用户会话中运行外部进程,服务可以使用
WTSQueryUserToken()
获取会话的用户令牌,然后使用CreateProcessAsUser()
以该用户身份运行该进程。