从AD中获取SharePoint用户的登录名和显示名的方法

本文介绍了如何在SharePoint中通过不同的方法获取Active Directory(AD)用户登录名和显示名。利用SPContext.Current.Web.CurrentUser可以便捷地得到登录名和显示名,但有时Sid为空,此时可通过链接中的方法获取。此外,还提到通过PeopleEditor对象的GetAccountFromSid方法结合Windows API获取登录名,但该方法无法直接得到显示名。

有多种方法来获取登录用户的登录名(login name)或者显示名(display name),这里总结几个。

1. SharePoint本身的对象模型就可以获取,使用SPContext.Current.Web.CurrentUser中可以获得登录名(login name),显示名(display name),和sid

例如对域名为domain,用户名为tonyW,显示名为tony wang的用户:

登录名:

SPContext.Current.Web.CurrentUser.LoginName //获取登录名: domain\tonyW

显示名: 

SPContext.Current.Web.CurrentUser.Name //获取显示名: tony wang

Sid:

SPContext.Current.Web.CurrentUser.Sid

有时候使用上面的方法获得的Sid是空的,这样的情况可以使用这篇文章中的方法获取Sid:点击打开链接

2. 因为Sid是将SharePoint用户和对应的AD用户连接起来的桥梁,所以可以使用Sid获取AD用户,然后得到登录名和显示名:
登录名:

using System.DirectoryServices.ActiveDirectory;

public static string GetLoginName(string userSid)
{
    string loginName = string.Empty;
    string domainName = string.Empty;
    try
    {
        domainName = Domain.GetCurrentDomain().Name; //获取domain name
        DirectoryEntry entry = new DirectoryEntry(String.Format("LDAP://{0}/<SID={1}>", domainName, userSid)); //根据sid获得AD用户
        loginName = entry.Properties["sAMAccountName"][0].ToString(); //获得sAMAccountName
    }
    catch{}

    if(!string.IsNullOrEmpty(loginName) && !string.IsNullOrEmpty(domainName))
    {
        loginName = string.Format("{0}\\{1}", domainName, loginName); //使用domain name和sAMAccountName拼接login name
    }
             
    return loginName;
}
//结果:domain\tonyW
显示名
using System.DirectoryServices.ActiveDirectory;

public static string GetLoginName(string userSid)
{
    string displayName = string.Empty;
    string domainName = string.Empty;
    try
    {
        domainName = Domain.GetCurrentDomain().Name; //获取domain name
        DirectoryEntry entry = new DirectoryEntry(String.Format("LDAP://{0}/<SID={1}>", domainName, userSid)); //根据sid获得AD用户
        displayName = entry.Properties["displayName"][0].ToString(); //获得displayName,显示名
    }
    catch{}

    return displayName;
}
//结果:tony wang

3. 另外一种获取登录名的方法(这个方法不能获取显示名)是使用PeopleEditor对象,这个对象提供了一个方法GetAccountFromSid,这个方法可以接收一个sid,返回用户的登录名。因为参数是byte[]类型,所以首先需要把字符串类型的sid转换为byte[],这里使用的是windows 提供的API: ConvertStringSidToSid,而不能直接使用GetBytes方法,否则会出错。

[System.Runtime.InteropServices.DllImport("Advapi32.DLL", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public static extern bool ConvertStringSidToSid(string stringSid, out IntPtr pSid);
[System.Runtime.InteropServices.DllImport("Advapi32.DLL", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public static extern int GetLengthSid(IntPtr psid);

public static byte[] ConvertStringSidToSid(string sid)
{
    IntPtr sidPtr;
    if (ConvertStringSidToSid(sid, out sidPtr))
    {
        int length = GetLengthSid(sidPtr);
        byte[] sidByte = new byte[length];
        System.Runtime.InteropServices.Marshal.Copy(sidPtr, sidByte, 0, length);
        System.Runtime.InteropServices.Marshal.FreeHGlobal(sidPtr);
        return sidByte;
    }
    else
    {
        return null;
    }
}
然后使用GetAccountFromSid方法:

using Microsoft.SharePoint.WebControls;

public static string GetLoginName(string sid)
{
    byte[] sidBytes = ConvertStringSidToSid(sid);
    string loginName = PeopleEditor.GetAccountFromSid(sidBytes);
    return loginName;
}
//结果: domain\tonyW





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值