我正在编写一个服务,我试图获取登录的用户的sid,但由于某种原因,它无法工作。它只返回{S-1-5-18}。然而,如果我创建一个快速的控制台应用程序,它就能正常工作。
我尝试了两种方法:
WindowsIdentity usr = WindowsIdentity.GetCurrent();
return usr.User
以及:
UserPrincipal.Current.Sid
它们在我的服务中都有同样的效果。它们都只返回{S-1-5-18}。然而,在控制台应用程序中,它们都返回完整的用户sid。
这可能是什么原因造成的?
发布于 2015-04-15 20:59:33
我假设您正在以NT AUTHORITY\SYSTEM
或.\LOCALSYSTEM
运行您的服务进程。有关更多详细信息,请参阅KB 243330:
SID: S-1-5-18
名称:本地系统
说明:操作系统使用的服务帐号。
如果你想从桌面会话中获取SID,你可以这样做(通过使用cassia - nuget-package available):
ITerminalServicesSession GetActiveSession()
{
var terminalServicesSession = default(ITerminalServicesSession);
var terminalServicesManager = new TerminalServicesManager();
using (var server = terminalServicesManager.GetLocalServer())
{
foreach (var session in server.GetSessions())
{
if (session.ConnectionState == ConnectionState.Active)
{
// yep, I know ... LINQ ... but this is from a plain .NET 2.0 source ...
terminalServicesSession = session;
break;
}
}
}
return terminalServicesSession;
}
ITerminalServiceSession
-instance确实包含属性SessionId
,它应该根据需要工作。但请注意,与会话状态相关的警告-我不保证我的条件足够,您可能需要根据需要调整ConnectionState
上的条件。
发布于 2015-04-15 21:01:21
这些API将返回执行当前进程的用户的SID,在您的情况下是您的服务。S-1-5-18
是NT AUTHORITY\SYSTEM
。
可以有从零到多个用户登录到Windows系统(用于交互使用:本地或远程):没有单一的“登录用户”。
你需要改进你的需求:为什么你想知道登录的用户?
https://stackoverflow.com/questions/29650835
复制相似问题