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