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

有多种方法来获取登录用户的登录名(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





你可能感兴趣的:(name,login,SharePoint,sid,ad)