在尝试回答这个问题我遇到了一些困扰我一段时间的事情,但我一直无法找到答案。
以下脚本块将列出本地管理员组的所有成员的名称。
$group = [ADSI]"WinNT://./Administrators"
@($group.Invoke("Members")) | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
然而它将列出仅有的名称,没有其他属性。
我相当确定Members
我可以提取其他属性,但我不明白如何识别这些其他属性是什么。
我不一定需要知道该物品的附加属性,这更多的是一个我如何去找到它们的问题。
(如果这一切有点模糊,我深感抱歉,这方面我基本上是自学的,我很清楚我可能会选错方向或经常犯可怕的错误。)
答案1
请在此处查看可用房产:
http://msdn.microsoft.com/en-us/library/aa705950(v=VS.85).aspx
以及与您的问题类似的例子:
由于您已经获得了该组的成员姓名列表,为了获取成员的详细信息,我只需再次查询,但针对的是个人用户而不是组。
PS C:\> $group = [ADSI]"WinNT://./administrators"
PS C:\> $members = $group.Invoke("Members") | % {$_.GetType().InvokeMember("name", 'GetProperty', $null, $_, $null) }
PS C:\> $membersObjects = @() ; $members | % { $membersObjects += [ADSI]"WinNT://./$_" }
PS C:\> $membersObjects | gm
TypeName: System.DirectoryServices.DirectoryEntry
Name MemberType Definition
---- ---------- ----------
ConvertDNWithBinaryToString CodeMethod static string ConvertDNWithBinaryToString(psobject deInstance, psobject dnWithBinaryInstance)
ConvertLargeIntegerToInt64 CodeMethod static long ConvertLargeIntegerToInt64(psobject deInstance, psobject largeIntegerInstance)
AutoUnlockInterval Property System.DirectoryServices.PropertyValueCollection AutoUnlockInterval {get;set;}
BadPasswordAttempts Property System.DirectoryServices.PropertyValueCollection BadPasswordAttempts {get;set;}
Description Property System.DirectoryServices.PropertyValueCollection Description {get;set;}
FullName Property System.DirectoryServices.PropertyValueCollection FullName {get;set;}
HomeDirDrive Property System.DirectoryServices.PropertyValueCollection HomeDirDrive {get;set;}
HomeDirectory Property System.DirectoryServices.PropertyValueCollection HomeDirectory {get;set;}
LastLogin Property System.DirectoryServices.PropertyValueCollection LastLogin {get;set;}
LockoutObservationInterval Property System.DirectoryServices.PropertyValueCollection LockoutObservationInterval {get;set;}
LoginHours Property System.DirectoryServices.PropertyValueCollection LoginHours {get;set;}
LoginScript Property System.DirectoryServices.PropertyValueCollection LoginScript {get;set;}
MaxBadPasswordsAllowed Property System.DirectoryServices.PropertyValueCollection MaxBadPasswordsAllowed {get;set;}
MaxPasswordAge Property System.DirectoryServices.PropertyValueCollection MaxPasswordAge {get;set;}
MaxStorage Property System.DirectoryServices.PropertyValueCollection MaxStorage {get;set;}
MinPasswordAge Property System.DirectoryServices.PropertyValueCollection MinPasswordAge {get;set;}
MinPasswordLength Property System.DirectoryServices.PropertyValueCollection MinPasswordLength {get;set;}
Name Property System.DirectoryServices.PropertyValueCollection Name {get;set;}
objectSid Property System.DirectoryServices.PropertyValueCollection objectSid {get;set;}
Parameters Property System.DirectoryServices.PropertyValueCollection Parameters {get;set;}
PasswordAge Property System.DirectoryServices.PropertyValueCollection PasswordAge {get;set;}
PasswordExpired Property System.DirectoryServices.PropertyValueCollection PasswordExpired {get;set;}
PasswordHistoryLength Property System.DirectoryServices.PropertyValueCollection PasswordHistoryLength {get;set;}
PrimaryGroupID Property System.DirectoryServices.PropertyValueCollection PrimaryGroupID {get;set;}
Profile Property System.DirectoryServices.PropertyValueCollection Profile {get;set;}
UserFlags Property System.DirectoryServices.PropertyValueCollection UserFlags {get;set;}
答案2
问题是您正在处理 COM 对象,而这些对象似乎没有提供在 PowerShell 中向您显示所有内容的方法。
您还可以在此处查看不同(C#)线程上的类似问题:https://stackoverflow.com/questions/10615019/get-property-names-via-reflection-of-an-com-object
答案3
扩展@Jacob的想法。当您枚举组的成员时,只会返回字符串对象,而不是 AD 用户对象。因此,唯一可用的属性是字符串属性(即长度等)。您需要使用名称作为 -identity 参数再次查询 AD 以检索用户属性。
在 AD 中你可以做这样的事情:
$(get-adgroup "administrators" -Properties members).members|foreach {get-aduser -identity $_}
我不能代表 WinNT 的代码发言