我在寻找解决方案的时间相当长,但我发现所有解决方案都非常慢。 我想让本地窗口组中的所有用户。该组当然也可以含有AD组。因此,结果应包含属于该组本身的成员的所有用户和所包含的AD组的用户。 您是否知道一个具有良好性能的解决方案?如何获得本地组中的所有用户(具有良好性能)
2
A
回答
2
您是否尝试过这个,这个样本获取管理员组的成员在本地计算机
using System;
using System.DirectoryServices.AccountManagement;
using System.Collections;
class Program
{
static void Main(string[] args)
{
ArrayList myGroups = GetGroupMembers("Administrators");
foreach (string item in myGroups)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
public static ArrayList GetGroupMembers(string sGroupName)
{
ArrayList myItems = new ArrayList();
GroupPrincipal oGroupPrincipal = GetGroup(sGroupName);
PrincipalSearchResult<Principal> oPrincipalSearchResult = oGroupPrincipal.GetMembers();
foreach (Principal oResult in oPrincipalSearchResult)
{
myItems.Add(oResult.Name);
}
return myItems;
}
public static GroupPrincipal GetGroup(string sGroupName)
{
PrincipalContext oPrincipalContext = GetPrincipalContext();
GroupPrincipal oGroupPrincipal = GroupPrincipal.FindByIdentity(oPrincipalContext, sGroupName);
return oGroupPrincipal;
}
public static PrincipalContext GetPrincipalContext()
{
PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Machine);
return oPrincipalContext;
}
}
0
嘿,我做了一组类来做到这一点而回,但它得到了他们基于域而不是组:) :)
这里是类。有一个userManager类和一个用户类
public class UserManager
{
private string _domainName;
private Dictionary<string, User> _userLookup;
private PrincipalContext domainContext;
private DirectoryEntry LDAPdirectory;
public UserManager(string domainName)
{
_domainName = domainName;
_userLookup = new Dictionary<string, User>();
domainContext = new PrincipalContext(ContextType.Domain, _domainName);
//Make the LDAP directory look for all users within the domain. DC Com, Au for australia
LDAPdirectory = new DirectoryEntry("LDAP://DC=" + _domainName.ToLower() + ",DC=com,DC=au");
LDAPdirectory.AuthenticationType = AuthenticationTypes.Secure;
}
public IEnumerable<User> Users
{
get
{
return _userLookup.Values.ToArray<User>();
}
set
{
_userLookup.Clear();
foreach (var user in value)
{
if (!_userLookup.ContainsKey(user.Login))
_userLookup.Add(user.Login, user);
}
}
}
/// <summary>
/// Gets all the users from the AD domain and adds them to the Users property. Returns the list.
/// </summary>
/// <returns></returns>
public IEnumerable<User> UpdateAllUsers()
{
DirectorySearcher searcher = new DirectorySearcher(LDAPdirectory);
searcher.Filter = "(&(&(objectClass=user)(objectClass=person)(!objectClass=computer)(objectClass=organizationalPerson)(memberof=*)(telephonenumber=*)))";
SearchResultCollection src = searcher.FindAll();
_userLookup.Clear();
foreach (SearchResult result in src)
{
User newUser = new User(domainContext, result.Properties["samaccountname"][0].ToString());
if (newUser.IsInitialized)
{
_userLookup.Add(newUser.Login, newUser);
yield return newUser;
}
}
}
public User GetUser(string userLogin)
{
return new User(domainContext, userLogin);
}
public bool HasUser(string login)
{
return _userLookup.ContainsKey(login);
}
}
public class User
{
public User()
{
IsInitialized = false;
}
/// <summary>
/// Initializes a new user based on the AD info stored in the domain
/// </summary>
/// <param name="domainContext">The domain to search for this user</param>
/// <param name="userName">The user to look for</param>
public User(PrincipalContext domainContext, string userName)
{
try
{
using (UserPrincipal thisUserPrincipal = UserPrincipal.FindByIdentity(domainContext, userName))
{
this.FirstName = thisUserPrincipal.GivenName;
this.Surname = thisUserPrincipal.Surname;
this.DisplayName = thisUserPrincipal.DisplayName;
this.Email = thisUserPrincipal.EmailAddress;
this.ContactNumber = thisUserPrincipal.VoiceTelephoneNumber;
this.Login = thisUserPrincipal.SamAccountName;
IsInitialized = true;
}
}
catch (Exception)
{
IsInitialized = false;
return;
}
}
/// <summary>
/// Gets a value determining if this user was properly initialized or if an exception was thrown during creation
/// </summary>
public bool IsInitialized { get; set; }
public string FirstName { get; set; }
public string Surname { get; set; }
public string DisplayName { get; set; }
public string Email { get; set; }
public string Login { get; set; }
public string ContactNumber { get; set; }
}
-1
你可以使用powershell来解决这个问题。
function GetLocalArray{
[CmdletBinding()]
param(
Parameter(ValueFromPipeline=$True,position=0,mandatory=$true)]$ComputerArray
)
BEGIN{
[email protected]()
[email protected]()
}
PROCESS{
foreach($computer in $ComputerArray){
$gwmiquery = Get-WMIObject win32_group -filter "LocalAccount='True'" -computername $computer #| where{$_.Name -like "*Administrators"} #uncomment to filter the result to just local administrators group
$gwmiquery | foreach{
$name=$_.Name;
$A=$_.GetRelated("Win32_UserAccount").Name -join ";"; #users
$B=$_.GetRelated("Win32_Account").Name -join ";"; #systemgroup
$memberUsers = New-Object PSObject -Property @{ComputerName=$_.PSComputerName;Name=$name;AllMembers=$B;Members=$A}
$members+=$memberUsers;
}
}
$filter+= $members | foreach{$name=$_.name; if(! [String]::IsNullOrWhiteSpace($_.AllMembers)) { $_ } }
}
END{
return $filter
}
}
阅读计算机免受这样的文件:
$computers = Get-Content $Global:ComputersFile
$AllComputerMembers = GetLocalArray -ComputerArray $computers
从这里也可以使用,的ConvertTo-CSV,出口CSV,的ConvertTo-JSON 把它用在网页或Excel。
相关问题
- 1. 具有良好性能的多地图
- 2. 如何获取本地用户所属的所有本地组
- 3. 具有良好GUI的本地语言
- 4. 是否有任何具有良好性能的泛型TypeConvertor?
- 5. 如何查询多个COUNT(*)具有良好的性能
- 6. 具有良好性能的阵列中的采样值
- 7. 使用具有良好性能的Aspose创建pdf文件
- 8. MVC3电网具有良好的功能
- 9. 如何从磁带获得良好的读取性能?
- 10. 如何获得具有特殊性能的GET-ADUser便有
- 11. 如何从Kinvey获得所有用户
- 12. 如何获得所有广告组的特定用户
- 13. 保持良好的性能与MySQL数据库,获得更多的用户
- 14. 如何获得多维数组的所有可能组合
- 15. 如何获得具有所选属性的选项值
- 16. 如何从HTML中获得具有相同类属性的所有元素?
- 17. 获取具有自定义属性的所有Sitecore用户
- 18. 寻找具有良好可用性的应用程序
- 19. 具有良好用户登录的PHP框架/ admin
- 20. 如何从DB获得良好结果
- 21. 如何获得可能具有空值的主键组合?
- 22. Java中的原始multimap具有良好的(插入,迭代)性能特征
- 23. 如何获得所有本地变量的转储?
- 24. 如何从包含另一个数组的所有元素的数组中获得所有可能的组合
- 25. 如何获得具有给定属性的所有Unicode字符的列表?
- 26. 如何获得所有可能的组合在Array
- 27. 获得更好的性能
- 28. 如何正确组织标题以获得良好的Web可访问性?
- 29. 如何获得redis中的所有用户
- 30. 如何从用户的订阅中获得所有帖子