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

被折叠的 条评论
为什么被折叠?



