如何获得用户所属的所有组?
PowerShell的Get-ADGroupMember
cmdlet返回特定组的成员。 是否有一个cmdlet或属性来获取特定用户所属的所有组?
我解决了我的错误: Get-Member
应该是Get-ADGroupMember
。
Get-ADPrincipalGroupMembership将执行此操作。
Get-ADPrincipalGroupMembership username | select name name ---- Domain Users Domain Computers Workstation Admins Company Users Company Developers AutomatedProcessingTeam
单行,不需要模块,使用当前logging的用户:
(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($env:username)))")).FindOne().GetDirectoryEntry().memberOf
对此vbs / powershell文章的声明: http ://technet.microsoft.com/en-us/library/ff730963.aspx
(GET-ADUSER –Identity USERNAME –Properties MemberOf | Select-Object MemberOf).MemberOf
一个更简洁的替代Canoas发布的,以获得当前login用户的组成员资格。
我在这个博客文章中遇到了这个方法: http : //www.travisrunyard.com/2013/03/26/auto-create-outlook-mapi-user-profiles/
([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof
一个更好的版本,它使用正则expression式剥离LDAP guff并仅保留组名:
([ADSISEARCHER]"samaccountname=$($env:USERNAME)").Findone().Properties.memberof -replace '^CN=([^,]+).+$','$1'
有关使用[ADSISEARCHER]types加速器的更多详细信息,请参见脚本编写人员博客: http : //blogs.technet.com/b/heyscriptingguy/archive/2010/08/24/use-the-powershell-adsisearcher-type -accelerator到search主动directory.aspx
CMD的老派方式:
net user mst999 /domain
获取用户的组成员资格:
$strUserName = "Primoz" $strUser = get-qaduser -SamAccountName $strUserName $strUser.memberof
请参阅获取用户的组成员身份
但是,请参阅Quest的Active Directory免费PowerShell命令 。
[ 编辑 : Get-ADPrincipalGroupMembership命令包含在Windows 2008 R2以来的v2以来的PowerShell中。 请参阅下面的kstrauss的答案。]
Get-Member
是用于列出.NET object
成员的cmdlet。 这与用户/组成员身份无关。 您可以像这样获取当前用户的组成员资格:
PS> [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups | Format-Table -auto BinaryLength AccountDomainSid Value ------------ ---------------- ----- 28 S-1-5-21-... S-1-5-21-2229937839-1383249143-3977914998-513 12 S-1-1-0 28 S-1-5-21-... S-1-5-21-2229937839-1383249143-3977914998-1010 28 S-1-5-21-... S-1-5-21-2229937839-1383249143-3977914998-1003 16 S-1-5-32-545 ...
如果您需要访问任意用户的组信息,那么@tiagoinu使用Quest AD cmdlet的build议是更好的方法。
当它是一个简单的一个class轮时,不需要长的脚本。
QUEST命令
(Get-QADUser -Identity john -IncludedProperties MemberOf | Select-Object MemberOf).MemberOf
MS AD命令
(GET-ADUSER –Identity john –Properties MemberOf | Select-Object MemberOf).MemberOf
我发现MS AD CMD更快,但有些人更喜欢Quest的。
史蒂夫
Get-Member不用于获取用户的组成员资格。 如果您想获取用户在本地系统上所属的组列表,可以通过以下方式进行:
$query = "ASSOCIATORS OF {Win32_Account.Name='DemoUser1',Domain='DomainName'} WHERE ResultRole=GroupComponent ResultClass=Win32_Account" Get-WMIObject -Query $query | Select Name
在上面的查询中,将DemoUser1replace为您需要的用户名和DomainName与您的本地计算机名称或域名称。
这只是一条线:
(get-aduser joe.bloggs -properties *).memberof
结束 :)
使用:
Get-ADPrincipalGroupMembership username | select name | export-CSV username.csv
这将命令的输出转换为CSV文件。
首先,导入活动目录模块:
import-module activedirectory
然后发出这个命令:
Get-ADGroupMember -Identity $group | foreach-object { Write-Host $_.SamAccountName }
这将显示指定组的成员。
下面的工作很好:
get-aduser $username -Properties memberof | select -expand memberof
如果你有一个用户列表:
$list = 'administrator','testuser1','testuser2' $list | ` %{ $user = $_; get-aduser $user -Properties memberof | ` select -expand memberof | ` %{new-object PSObject -property @{User=$user;Group=$_;}} ` }
我写了一个名为Get-ADPrincipalGroupMembershipRecursive的PowerShell函数。 它接受用户,计算机,组或服务帐户的DSN。 它从账户的memberOf属性中检索组的初始列表,然后recursion地检查这些组的成员资格。 缩写代码如下。 完整的源代码与评论可以在这里find 。
function Get-ADPrincipalGroupMembershipRecursive( ) { Param( [string] $dsn, [array]$groups = @() ) $obj = Get-ADObject $dsn -Properties memberOf foreach( $groupDsn in $obj.memberOf ) { $tmpGrp = Get-ADObject $groupDsn -Properties memberOf if( ($groups | where { $_.DistinguishedName -eq $groupDsn }).Count -eq 0 ) { $groups += $tmpGrp $groups = Get-ADPrincipalGroupMembershipRecursive $groupDsn $groups } } return $groups } # Simple Example of how to use the function $username = Read-Host -Prompt "Enter a username" $groups = Get-ADPrincipalGroupMembershipRecursive (Get-ADUser $username).DistinguishedName $groups | Sort-Object -Property name | Format-Table
Get-QADUser -SamAccountName LoginID | %{$ _。MemberOf} | Get-QADGroup | select姓名
Import-Module ActiveDirectory Get-ADUser -SearchBase "OU=Users,DC=domain,DC=local" -Filter * | foreach-object { write-host "User:" $_.Name -foreground green Get-ADPrincipalGroupMembership $_.SamAccountName | foreach-object { write-host "Member Of:" $_.name } }
更改-SearchBase的值以反映您需要列出用户的OU
这将列出该OU中的所有用户并显示他们是哪个组的成员。
Get-ADPrincipalGroupMembership USERLOGON | select姓名
Get-ADUser -Filter { memberOf -RecursiveMatch "CN=Administrators,CN=Builtin,DC=Fabrikam,DC=com" } -SearchBase "CN=Administrator,CN=Users,DC=Fabrikam,DC=com" -SearchScope Base ## NOTE: The above command will return the user object (Administrator in this case) if it finds a match recursively in memberOf attribute.
这是获取名字的最简单的方法:
Get-ADPrincipalGroupMembership "YourUserName"
# Returns distinguishedName : CN=users,OU=test,DC=SomeWhere GroupCategory : Security GroupScope : Global name : testGroup objectClass : group objectGUID : 2130ed49-24c4-4a17-88e6-dd4477d15a4c SamAccountName : testGroup SID : S-1-5-21-2114067515-1964795913-1973001494-71628
添加一个select语句来修改响应,或者让每个用户都属于他们的用户:
foreach ($user in (get-aduser -SearchScope Subtree -SearchBase $oupath -filter * -Properties samaccountName, MemberOf | select samaccountName)){ Get-ADPrincipalGroupMembership $user.samaccountName | select name}
我无法得到以下为特定用户工作:
Get-ADPrincipalGroupMembership username
它抛出一个错误,我不愿意排除故障。
然而,我用Get-ADUser想出了一个不同的解决scheme。 我更喜欢它,因为如果您不知道帐户名称,那么您可以基于用户实际名称的通配符来获取它。 只需填写PartOfUsersName然后就可以了。
#Get the groups that list of users are the member of using a wildcard search [string]$UserNameLike = "*PartOfUsersName*" #Use * for wildcards here [array]$AccountNames = $(Get-ADUser -Filter {Name -like $UserNameLike}).SamAccountName ForEach ($AccountName In $AccountNames) { Write-Host "`nGETTING GROUPS FOR" $AccountName.ToUpper() ":" (Get-ADUser -Identity $AccountName -Properties MemberOf|select MemberOf).MemberOf| Get-ADGroup|select Name|sort name }
巨大的道具给schmeckendeugler和8DH让我到这个解决scheme。 +1给你们两个。
为了recursion,你可以使用:
<# .SYNOPSIS Get all the groups that a user is MemberOf. .DESCRIPTION This script retrieves all the groups that a user is MemberOf in a recursive way. .PARAMETER SamAccountName The name of the user you want to check #> Param ( [String]$SamAccountName = 'test', $DomainUsersGroup = 'CN=Domain Users,CN=Users,DC=domain,DC=net' ) Function Get-ADMemberOf { Param ( [Parameter(ValueFromPipeline)] [PSObject[]]$Group, [String]$DomainUsersGroup = 'CN=Domain Users,CN=Users,DC=grouphc,DC=net' ) Process { foreach ($G in $Group) { $G | Get-ADGroup | Select -ExpandProperty Name Get-ADGroup $G -Properties MemberOf| Select-Object Memberof | ForEach-Object { Get-ADMemberOf $_.Memberof } } } } $Groups = Get-ADUser $SamAccountName -Properties MemberOf | Select-Object -ExpandProperty MemberOf $Groups += $DomainUsersGroup $Groups | Get-ADMemberOf | Select -Unique | Sort-Object
以上几乎所有的解决scheme都使用了ActiveDirecotry
模块,在大多数情况下默认情况下可能不可用。
我用下面的方法。 有点间接,但满足了我的目的。
列出所有可用的组
Get-WmiObject -Class Win32_Group
然后列出用户所属的组
[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups
比较可以通过检查SIDs
来完成。 这适用于login的用户。 如果我错了,请纠正我。 PowerShell完全是新的,但必须完成这项工作的承诺。
用户input和花哨的输出格式:
[CmdletBinding(SupportsShouldProcess=$True)] Param( [Parameter(Mandatory = $True)] [String]$UserName ) Import-Module ActiveDirectory If ($UserName) { $UserName = $UserName.ToUpper().Trim() $Res = (Get-ADPrincipalGroupMembership $UserName | Measure-Object).Count If ($Res -GT 0) { Write-Output "`n" Write-Output "$UserName AD Group Membership:" Write-Output "===========================================================" Get-ADPrincipalGroupMembership $UserName | Select-Object -Property Name, GroupScope, GroupCategory | Sort-Object -Property Name | FT -A } }