VB.net使用system.directoryservices获取displayname

时间:2015-06-24 17:51:40

标签: .net vb.net iis

我正在尝试使用system.directoryservices.accountmanagement.userprincipal.current.displayname获取用户全名 但是这将返回在应用程序池标识中设置的域帐户的显示名称。

我已启用Windows身份验证并禁用匿名。域帐户在活动目录中启用了委派(我被告知这是必需的)。

我是如何获取当前登录用户的全名而不是应用程序池身份帐户的?

1 个答案:

答案 0 :(得分:2)

我想我会为此添加一些背景以供将来参考。

此信息的额外间接是因为与用户身份和信息相关联的“正常”API从与正在运行的可执行文件关联的当前执行上下文返回信息;在这种情况下,在IIS下,这是与运行站点代码的运行时宿主环境(w3wp.exe)关联的应用程序池标识。

但是,在大多数Web应用程序环境中,应用程序对访问该站点的用户的身份感兴趣。该信息在IIS和浏览器之间协商,并保存在保存当前请求的HttpContext对象中。当 Windows身份验证 启用时,会提供身份信息,匿名身份验证

这是代码。

尝试

Request.LogonUserIdentity.Name

它应该从HTTP上下文中获取当前请求的身份。

编辑:根据以下OP的评论,这将为您提供AD的全名。请务必设置对System.DirectoryServices的引用:

protected void Page_Load(object sender, EventArgs e)
{
   string[] UserInfo= Context.User.Identity.Name.Split('\\');
   DirectoryEntry ADEntry = new DirectoryEntry("WinNT://" + UserInfo[0] + "/" + UserInfo[1]);
   string UserFullName = ADEntry.Properties["FullName"].Value.ToString();

}

编辑2:这是一个更现代的一个,意识到WinNT提供商有点约会我:)请务必查看对System.DirectoryServices.AccountManagement的引用:

protected void Page_Load(object sender, EventArgs e)
{
       var domainContext= new PrincipalContext(ContextType.Domain);
       var user  = System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(domainContext,Context.User.Identity.Name);
       string userName = user.DisplayName;
}

编辑3 :VB版本,因为我显然无法读取OP对VB解决方案的请求:)

   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

       ' Version 1, with old WinNT provider

       Dim UserInfo As String() = Context.User.Identity.Name.Split(New Char() {"\"})
       Dim ADEntry As DirectoryEntry = New DirectoryEntry("WinNT://" + UserInfo(0) + "/" + UserInfo(1))
       Dim UserFullName As String = ADEntry.Properties("FullName").Value.ToString()

       ' Version 2, with System.DirectoryServices.AccountManagement

       Dim DomainContext As PrincipalContext = New PrincipalContext(ContextType.Domain)
       Dim User As UserPrincipal = UserPrincipal.FindByIdentity(DomainContext, Context.User.Identity.Name)
       Dim UserFullName2 As String = User.DisplayName

   End Sub