我正在制作Richard L. Mueller(http://www.rlmueller.net/PowerShell/PSLastLogon.txt)
的剧本Trap {"Error: $_"; Break;}
$D = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$Domain = [ADSI]"LDAP://$D"
$Searcher = New-Object System.DirectoryServices.DirectorySearcher
$Searcher.PageSize = 200
$Searcher.SearchScope = "subtree"
$Searcher.Filter = "(&(objectCategory=person)(objectClass=user))"
$Searcher.PropertiesToLoad.Add("samAccountName") > $Null
$Searcher.PropertiesToLoad.Add("lastLogon") > $Null
$arrUsers = @{}
ForEach ($DC In $D.DomainControllers)
{
$Server = $DC.Name
$Searcher.SearchRoot = "LDAP://$Server/" + $Domain.distinguishedName
$Results = $Searcher.FindAll()
ForEach ($Result In $Results)
{
$DN = $Result.Properties.Item("samAccountName")
$LL = $Result.Properties.Item("lastLogon")
If ($LL.Count -eq 0)
{
$Last = [DateTime]0
}
Else
{
$Last = [DateTime]$LL.Item(0)
}
If ($Last -eq 0)
{
$LastLogon = $Last.AddYears(1600)
}
Else
{
$LastLogon = $Last.AddYears(1600).ToLocalTime()
}
If ($arrUsers.ContainsKey("$DN"))
{
If ($LastLogon -gt $arrUsers["$DN"])
{
$arrUsers["$DN"] = $LastLogon
}
}
Else
{
$arrUsers.Add("$DN", $LastLogon)
}
}
}
$inactiveusers = @()
$Users = $arrUsers.Keys
ForEach ($DN In $Users)
{
$Date = $arrUsers["$DN"]
"$DN;$Date"
$inactiveusers += $DN
$inactiveusers += $Date
$inactiveusers | export-csv "c:\test.csv"
}
考虑将信息存储到另一个数组,我将这些行添加为$ inactiveusers(总共4行)。但是,导出的CSV不会给我正确的结果,而不是列出用户samAccountName& lastlogon,返回samAccountName的长度。
除此之外,从那以后我无法在我的另一个脚本中导出相同的变量,即使脚本只是简单如下:
$inactiveusers = "Test"
$inactiveusers | Export-Csv c:\test.csv
write-host $inactiveusers
导出的CSV仍然给我字符串的长度"测试",但是写主机结果是正确的。 我试过remove-variable,logoff&登录回来,但都没有运气。 我不确定缓存存储在哪里。我可以稍后处理该脚本,但首先我希望能够在另一个脚本中将此变量导出为CSV。很感激任何人都可以给我一些提示
答案 0 :(得分:0)
为什么要将所有项目从$arrUsers
移至$inactiveusers
?您可以通过在最后添加它来获得所需的结果:
$arrUsers.getEnumerator() | Select-Object Key,Value |
Export-Csv c:\test.csv -NoTypeInformation
详细了解Export-CSV
:http://technet.microsoft.com/en-us/library/hh849932.aspx
答案 1 :(得分:0)
Export-Csv
cmdlet不导出字符串。它将对象的属性导出为输出CSV文件的字段。对于字符串对象,导出的属性是字符串的长度。您需要将哈希表转换为自定义对象列表,以使导出按预期工作:
$arrUsers.Keys | % {
New-Object -Type PSObject -Property @{
'sAMAccountName' = $_
'lastLogon' = $arrUsers[$_]
}
} | Export-Csv 'C:\test.csv' -NoType
此外,手动日期计算可以用FromFileTime()
方法替换:
$lastLogon = [DateTime]::FromFileTime($Result.Properties.Item("lastLogon"))
话虽如此,你为什么要“手工”这样做呢? ActiveDirectory
PowerShell模块有一个cmdlet Get-ADUser
,它已经为您完成了所有工作:
Import-Module ActiveDirectory
Get-ADUser -Filter * -Properties * | ? {
$_.LastLogonDate -lt (Get-Date).AddDays(-60)
} | select SamAccountName, LastLogonDate | Export-Csv 'C:\test.csv' -NoType