【问题标题】:Get all AD Users and their group memberships (recursively) using Powershell使用 Powershell 获取所有 AD 用户及其组成员身份(递归)
【发布时间】:2017-07-08 06:08:59
【问题描述】:

我有一个来自之前回答的问题的脚本,但没有足够的声誉来发表评论。我尝试运行该脚本并遇到此错误消息:

Export-CSV:无法将 CSV 内容附加到以下文件:C:\users.csv。附加的对象没有对应于以下列的属性:用户;组。要继续使用不匹配的属性,请添加 -Force 参数,然后重试该命令。

如何调试此脚本以解决此问题?

Function Get-ADGroupsRecursive{
Param([String[]]$Groups)
Begin{
    $Results = @()
}
Process{
    ForEach($Group in $Groups){
        $Results+=$Group
        ForEach($Object in (Get-ADGroupMember $Group|?{$_.objectClass -eq "Group"})){
            $Results += Get-ADGroupsRecursive $Object
        }
    }
}
End{
    $Results | Select -Unique
}}

import-module activedirectory

$users = get-aduser -Filter {Name -Like "*"} -Searchbase "OU=Sample Accounts,DC=domain,DC=com" -Properties MemberOf | Where-Object { $_.Enabled -eq 'True' } 

$targetFile = "C:\users.csv"
rm $targetFile
Add-Content $targetFile "User;Group"


foreach ($user in $users)
{
    $Groups = $User.MemberOf
    $Groups += $Groups | %{Get-ADGroupsRecursive $_}
$Groups | %{New-Object PSObject -Property @{User=$User;Group=$_}}|Export-CSV $targetfile -notype -append
}

【问题讨论】:

  • 删除这一行:Add-Content $targetFile "User;Group" 并让 PowerShell 处理 CSV 标头。
  • Export-csv 尝试匹配您手动添加到 $targetFile 的行,默认情况下不起作用 -Delimiter 是逗号,值是双引号。所以它将内容解释为一个属性User;Group
  • @MarkWragg 该脚本现在可以工作,但我最终得到以下错误消息:Get-AdGroupMember exceeding limit。这个限制有解决方法吗?
  • 你试过什么?我建议您先搜索解决方案。
  • 我相信我已经解决了自己的问题。此脚本无法在包含嵌套 OU 的 OU 上正确执行。因此,似乎最好的方法是在嵌套 OU 上执行之前编辑脚本的 searchbase

标签: powershell active-directory powergui


【解决方案1】:

试试这个功能

function Get-InChainGroups
{
    param (
        [parameter(mandatory = $true)]
        $user,
        $domain)

    $user1 = (get-aduser -filter { name -eq $user } -server $domain).distinguishedname
    Write-verbose "checking $user"
    $ldap = "(&(objectcategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648)(member:1.2.840.113556.1.4.1941:=$user1))"

    try { Get-ADobject -LDAPFilter $ldap -server $domain | select  @{ n = 'Identity'; e = { $user } }, Name, @{ n = 'DN'; e = { $_.distinguishedname } } | ft -a }
    catch { "Exception occurred" }


}

【讨论】:

  • 建议不要在函数中使用别名(selectft)或格式化 cmdlet(ft)。别名可以是非标准的,并且不需要格式化(让用户决定)。
  • 肯定的 - 它是从我的旧模块复制的,我忘了删除它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多