0

我正在编写一项服务,并且我正在尝试获取已登录用户的 sid,但无论出于何种原因它都无法正常工作。它只返回 {S-1-5-18}。但是,如果我创建一个快速控制台应用程序,它就可以正常工作。

我尝试了两种方法:

WindowsIdentity usr = WindowsIdentity.GetCurrent();
return usr.User

也:

UserPrincipal.Current.Sid

他们在我的服务中都有同样的影响。他们都只返回 {S-1-5-18}。然而在控制台应用程序中,它们都返回完整的用户 sid。

这可能是什么原因造成的?

4

2 回答 2

4

我想你正在运行你的服务进程作为NT AUTHORITY\SYSTEMor .\LOCALSYSTEM。有关详细信息,请参阅KB 243330 :

SID:S-1-5-18
名称:本地系统
描述:操作系统使用的服务帐户。

如果您想从桌面会话中获取 SID,您可以使用(通过使用可用的cassia - nuget-package):

    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-15T12:59:32.813 回答
0

Those APIs will return the SID of the user executing the current process, in your case your service. S-1-5-18 is NT AUTHORITY\SYSTEM.

There can be anything from zero to many users logged on to a Windows system (for interactive use: either locally or remotely): there is no singular "logged on user".

You need to refine your requirements: why do you want to know the logged on user?

于 2015-04-15T13:01:21.337 回答