从服务器获取Windows登录名

问题描述:

我一直在这个问题上坚持了几天 - 任何帮助,非常感谢。从服务器获取Windows登录名

我有一个SQL触发器调用一个用C#编写的DLL。在这个函数中,我需要发起启动触发器的SQL命令的人的Windows登录名。无论我是否从C#或SQL获取此信息都无关紧要。

不幸的是,大多数正常路线都失败了。

内置SQL函数NT_C​​LIENT()仅适用于SQL登录正在使用Windows身份验证。

该DLL在服务器上运行,因此Environment.UserName与WindowsIdentity.GetCurrent()。Name无关,并且除非数据库用户(线程发起者)使用Windows身份验证,否则返回空字符串。

我知道域名,IP地址和工作站名称。从这里我已经想出了如何在C#中获取SID - 无论如何,我可以从使用C#的那些信息中获取Windows登录名,或者是否存在SQL内置函数,我错过了?

编辑: 谢谢你让我知道SQL是这个问题的一个哑巴。我们所拥有的是一个将每个人都作为一个用户登录到数据库的客户端。我最终需要做的是做一个不安全的程序集,调用一个命令行函数WMIC。 Yucky的解决方案,但它完成了工作。再次感谢你提供的建议。 :)

+0

'SELECT user'返回什么? – CaffGeek 2010-03-03 16:33:01

+0

我相信您需要将您的源应用程序中的信息作为参数传递给您的服务器进程。我不确定你获得的SID是什么,我希望在Windows工作站有多个人登录时,会有一个状态,让你可以返回多个SID(如果实际上可以)。 – Lazarus 2010-03-03 16:33:58

+0

有时候更容易停止旋转你的车轮,并从不同的角度来接近它。也许触发器不是可行的解决方案。也许你只需要开始研究其他方法来完成你的解决方案。 – 2010-03-03 16:38:49

您必须从客户端代码中传递用户名作为参数。我们这样做是每个来自我们的客户代码(网站和服务)的呼叫。

但是,即使那样它在触发器中不可用,所以我使用CONTEXT_INFO。

没有魔力,没有银弹我很抱歉。

你的另一种选择是查看安全帐户授权/传递。 Google search ...有很多好东西,可能比一个特定的链接更好。

如果这是不可能的,你说你不能更改客户端代码,那么它不能完成。数据根本不可用:并且应用程序体系结构故意这样做。

你使用SQL身份验证?如果是的话,我认为这是不可能的,因为Windows登录与服务器登录没有关联。

+0

是的,SQL身份验证。我认为这可能是不可能从SQL,我希望以某种方式,我可以从C#做到这一点。看来,给定的IP地址,工作站名称等,应该有一种方法来找出谁在当前登录在该位置。 – Brandi 2010-03-03 16:47:25

+0

看,有可能得到用户登录这个信息必须传递给sql server。当它是sql auth模式时,它不被传递。你可以得到IP和其他网络的东西,但你不能得到没有通过的东西。 – Andrey 2010-03-03 16:50:28

+0

我明白 - 很高兴知道SQL不是获取此信息的途径。你是否也说过这些信息不能通过C#独立于SQL获得?我想,我正在寻找的是一些C#函数的效果:给出mydomainname,工作站名称,IP地址,告诉我谁在当前登录在这个位置?从目前我所知道的情况来看,这样的事情并不存在,但是确认这种或那种方式是很好的。谢谢你让我知道SQL是死路一条。 – Brandi 2010-03-03 17:10:28