我有兩個問題。c#:如何知道'用戶帳戶'是否存在於Windows?
1)如何知道我的Windows操作系統(vista)上是否存在「用戶帳戶」?我需要一個獨立機器的這個信息。我的意思是,機器不加入任何域。
2)我也想知道用戶是否屬於一個組?例如。是管理員組的用戶'管理員'部分還是不是?
任何人都可以請幫助..
我有兩個問題。c#:如何知道'用戶帳戶'是否存在於Windows?
1)如何知道我的Windows操作系統(vista)上是否存在「用戶帳戶」?我需要一個獨立機器的這個信息。我的意思是,機器不加入任何域。
2)我也想知道用戶是否屬於一個組?例如。是管理員組的用戶'管理員'部分還是不是?
任何人都可以請幫助..
我曾嘗試下面的代碼,併爲我工作很好..
public bool IsUserMemberOfGroup(string userName, string groupName)
{
bool ret = false;
try
{
DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + Environment.MachineName);
DirectoryEntry userGroup = localMachine.Children.Find(groupName, "group");
object members = userGroup.Invoke("members", null);
foreach (object groupMember in (IEnumerable)members)
{
DirectoryEntry member = new DirectoryEntry(groupMember);
if (member.Name.Equals(userName, StringComparison.CurrentCultureIgnoreCase))
{
ret = true;
break;
}
}
}
catch (Exception ex)
{
ret = false;
}
return ret;
}
你可能想看看這個forum post。它會通過機器上的用戶通過WMI爲您提供枚舉列表。然後你可以檢查你的賬戶是否在那裏。該論壇也鏈接到code project上的一篇文章。我相信你也可以通過WMI獲得組員資格,但我可能是錯的。
使用以下代碼可以計算出本地帳戶是否通過System.Security.Principal命名空間存在。
bool AccountExists(string name)
{
bool bRet = false;
try
{
NTAccount acct = new NTAccount(name);
SecurityIdentifier id = (SecurityIdentifier)acct.Translate(typeof(SecurityIdentifier));
bRet = id.IsAccountSid();
}
catch (IdentityNotMappedException)
{
/* Invalid user account */
}
return bRet;
}
現在越來越組成員身份是有點困難,你可以很容易地使用WindowsPrinciple.IsInRole方法(從WindowsIdentify.GetCurrent()方法創建一個原理)當前用戶做到這一點。
正如我所指出的,我不認爲有一種方法可以在不借助pinvoke或WMI的情況下獲得其他任何東西。所以這裏有一些代碼用於檢查WMI的組成員身份。
bool IsUserInGroup(string name, string group)
{
bool bRet = false;
ObjectQuery query = new ObjectQuery(String.Format("SELECT * FROM Win32_UserAccount WHERE Name='{0}' AND LocalAccount=True", name));
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection objs = searcher.Get();
foreach (ManagementObject o in objs)
{
ManagementObjectCollection coll = o.GetRelated("Win32_Group");
foreach (ManagementObject g in coll)
{
bool local = (bool)g["LocalAccount"];
string groupName = (string)g["Name"];
if (local && groupName.Equals(group, StringComparison.InvariantCultureIgnoreCase))
{
bRet = true;
break;
}
}
}
return bRet;
}
非常感謝蟲族。它正在工作,但有點慢。無論如何,再次感謝! – satya 2010-01-12 11:02:06
如果您將NTAccount更改爲此NTAccount acct = new NTAccount(Environment.MachineName,name);它的速度更快。因人而異。 – Tollo 2012-07-26 11:01:49