我正在写一项服务,我正在尝试登录用户的sid,无论出于何种原因,它都无法正常工作。它只返回{S-1-5-18}。然而,如果我创建一个快速控制台应用程序,它可以正常工作。
我尝试了两种方法:
WindowsIdentity usr = WindowsIdentity.GetCurrent();
return usr.User
以及:
UserPrincipal.Current.Sid
它们对我的服务都有同样的影响。他们都只返回{S-1-5-18}。然而,在控制台应用程序中,它们都返回完整的用户sid。
导致这种情况的原因是什么?
答案 0 :(得分:4)
我认为您的服务流程是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
- 实例确实包含应根据需要运行的属性SessionId
。但请注意,有一些与会话状态相关的警告 - 我不保证我的条件足够,您可能需要根据需要调整ConnectionState
的条件。
答案 1 :(得分:0)
这些API将返回执行当前进程的用户的SID,在您的情况下是您的服务。 S-1-5-18
为NT AUTHORITY\SYSTEM
。
从零到多用户可以登录到Windows系统(交互式使用:本地或远程):没有单独的“登录用户”。
您需要优化您的要求:您为什么想知道登录用户?