我从AD中提取信息,输出很多信息,以便稍后处理。
我需要将它导出到csv或其他东西,所以我可以有一个回滚(实际上是导入文件,所以我可以处理每个对象,就像我可以使用下面的哈希表。特别是在$ _。MemberOf里面。)
我正在努力处理的哈希表是:
$logging1 = @{
MemberOf="$users.MemberOf"
OriginalOU="$Ou.DistinguishedName"
DisabledWhen="$descriptionDisabled"
}
$logging = @{$users.SamAccountname = $logging1}
脚本的其余部分(未粘贴)是:
遍历一堆ou's。让用户上次登录-90天或更长时间,然后将它们传递给有问题的HashTable,我希望将其附加到稍后要导入的文件中。
我一直在谷歌上搜索几个小时没有到达某个地方
这是完整的脚本:
import-module ActiveDirectory
$descriptionDisabled = get-date -Format yyyyMMdd
$Loggdir = "C:\temp"
$array = @{}
$loggname = get-date -f yyyyMMdd
$90days = ((get-date).AddDays(-90))
$searchBase = 'OU=someou4,OU=someou3,OU=someou2,OU=someou1,DC=name,DC=NO'
$ExclusionList = Someexlutions
$OUlist = Get-ADOrganizationalUnit -SearchBase $searchBase
foreach ($Ou in $OUlist)
{
$ExpiredADusers = get-aduser -Filter {(LastlogonDate -le $90days)
-and (Enabled -eq $True)}
-SearchBase $ou.distinguishedname
-Properties *
#Get information about every user and their groupmembership
foreach ($Users in $ExpiredADusers)
{
$users = get-aduser -Identity $users.SamAccountName
-Properties *
| Select-Object -Property SamAccountName, MemberOf,
DistinguishedName, ObjectGUID
$logging = @{$person.SamAccountName = @{
MemberOf=$person.MemberOf;
OriginalOU=$Ou.DistinguishedName;
DisabledWhen="$descriptionDisabled"}}
$Array += $Logging
}
}
$array | export-clixml -path somepath -noclobber
编辑已解决 已解决的问题和原始脚本已更新,以处理嵌套哈希表
原始问题 我想你可以理解我想做什么。 我需要制作回滚文件。
因此导出的文件需要易于导入。使用哈希表时你可以使用。符号和memberof下的每个对象都被视为对象
回滚需要的是什么,所以我可以遍历导入的信息,将用户移回原来的OU位置并恢复成员资格
答案 0 :(得分:1)
我认为EBGreen在这里真的很受欢迎。您需要一组自定义对象,然后您可以将其导出为您想要的CSV。这也是代码中的一个微小变化。
$Array = @()
$ForEach($User in $Users){
$logging1 = New-Object PSObject -Property @{
MemberOf=$user.MemberOf
OriginalOU=$Ou.DistinguishedName
DisabledWhen=$descriptionDisabled
}
$Array += $Logging1
}
编辑:嗯,因此您希望能够导出和导入完整对象。您不需要CSV,因为您有嵌套数组,并且CSV不是为处理导出和导入而设计的。您需要XML,因此,如上所述,您需要使用Export-Clixml和Import-Clixml,因为XML可以处理嵌套数组。只要数组包含了所有数据,就可以将数组传输给它,并且你应该全部设置好。
Edit2:哈希表中的哈希表问题......好的,我们将其作为MemberOf="$user.MemberOf"
,这就是问题所在。它正在将其转换为字符串,因此它会扩展整个$ User
变量,并将.MemberOf
添加到它的末尾。在这种情况下,我们真的不想这样做,但是如果你想从双引号中访问对象的属性,你需要在它周围放置$()
。例如,如果您想将用户的专有名称包含为人类友好输出的一部分,您可以执行以下操作:
Write-Output "$($Users.Name)'s distinguished name is: $($users.distinguishedname)"
会输出类似的内容:
TMTech's distinguished name is: CN=TMTech,OU=Awesome,OU=Administrators,DC=Digital,DC=Ghost,DC=net