c#服务如何识别终端服务服务器上的当前用户登录名?

Posted

技术标签:

【中文标题】c#服务如何识别终端服务服务器上的当前用户登录名?【英文标题】:How can c# service identify current user logon name on Terminal Services Server? 【发布时间】:2013-01-15 22:38:06 【问题描述】:

c#服务如何获取调用它的终端服务器用户的身份(登录名)?

我写了一个c#服务来监听http请求并返回当前登录用户。该请求由在浏览器中运行的 javascript 初始化。到目前为止效果很好,但它不适用于可以同时连接多个用户的终端服务器。 我目前正在做的是查询“explorer”的processId,然后使用“GetOwner”获取用户登录名。

服务是否有办法识别为其生成 http 请求的用户? 我可以以某种方式获取 http 会话并识别拥有它的用户吗?我需要返回用户身份作为响应。

谢谢, JJ

【问题讨论】:

【参考方案1】:

您需要获取 HTTP 请求在客户端使用的端口,将其与机器上的活动出站 TCP 连接列表进行匹配,并识别浏览器的进程 ID(例如,通过 GetExtendedTcpTable) .从那里您可以获取进程的会话 ID(例如,通过使用 Process.SessionId),然后查找与会话关联的用户名(例如,通过使用 WTSQuerySessionInformation 或 Cassia)。或者您可以调用 OpenProcess 和 GetSecurityInfo 从进程 ID 中获取用户的 SID,正如 this answer 解释的那样。后一种方法可能更好,因为在单个会话中可能会有进程以不同的用户身份运行(例如,使用 Run As)。

不过,这一切似乎真的很痛苦。不能只在浏览器中使用 Windows 身份验证吗?

【讨论】:

感谢您的详尽回答(并在 Cassia 论坛发表评论)。 非常感谢您的详尽回答(以及对 Cassia 论坛的评论)。这确实是一个很大的痛苦,但我需要它,因为我需要自动获取用户名而不代表他进行任何操作。你有没有机会给我指点代码示例?我是 C# 开发新手。 当然——这是GetExtendedTcpTable sample和sample showing how to get a process's owner's name。

以上是关于c#服务如何识别终端服务服务器上的当前用户登录名?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不不断传递用户名/密码的情况下识别 Go 服务器上的用户

C#我们可以使用windows登录连接sqlserver数据库吗?

LocalSystem 服务如何以用户身份运行应用程序 [C#]?

为了使得多个用户能远程登陆,我装了终端服务,之后,远程桌面不能登陆,提示没有“终端服务器用户访问权限”

服务器排错命令

如何开启telnet服务