【发布时间】:2022-01-20 17:44:35
【问题描述】:
我尝试编写的第一个脚本。我试图通过比较用户名属性和描述属性来获取具有广告用户名和广告计算机的新变量。我不知道如何根据比较对象或匹配将我想要的属性拉入新变量中。描述属性有一个用户名设置 - ######## 数字非常。 使用的变量(日期告诉过期) $SevenDayWarnDate、$ThreeDayWarnDate、$OneDayWarnDate 广告用户 $7, $3, $1 -properties "Name", "PasswordExpiry 广告电脑 $comp “名称”、“描述” 然后,我将根据到期密码在用户计算机上弹出一个窗口。 以下是我正在尝试做的事情,但我不确定是否通过了所需的信息,因为计算机归档返回为空。
$SevenDayWarnDate = (get-date).adddays(7).ToLongDateString()
$7= Get-ADUser -filter {Enabled -eq $True -and PasswordNeverExpires -eq $False -and PasswordLastSet -gt 0 } `
-Properties "Name", "msDS-UserPasswordExpiryTimeComputed" | Select-Object -Property "Name", `
@{Name = "PasswordExpiry"; Expression = {[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed").tolongdatestring() }} `
|Where-object -Property PasswordExpiry -EQ $SevenDayWarnDate
$comp = Get-Adcomputer -Filter {Enabled -eq $True} -SearchBase "OU=,DC=" -properties "Name", "Description" `
| Select-Object -Property "Name", "Description"
Compare-Object -ReferenceObject $7 -DifferenceObject $comp -IncludeEqual -ExcludeDifferent -PassThru |
ForEach-Object {
[PSCustomObject]@{
Name = $_.name
Computer = ($comp.name | Where-Object Description -match $_.name).Directory
}
}
基于 Santiago Squarzon 下面的工作代码。
$dayArray= @()
$dayArray=@(7,3,1)
foreach ($day in $dayArray)
{
$SevenDayWarnDate = (get-date).adddays($day).ToLongDateString()
$filter = "Enabled -eq '$True' -and PasswordNeverExpires -eq '$False' -and PasswordLastSet -gt '0'"
$computerArray= @()
$users = Get-ADUser -Filter $filter -Properties "Name", "msDS-UserPasswordExpiryTimeComputed" |
Select-Object Name, @{
Name = "PasswordExpiry"
Expression =
{
[datetime]::FromFileTime($_."msDS-UserPasswordExpiryTimeComputed").tolongdatestring()
}
} | Where-object -Property PasswordExpiry -EQ $SevenDayWarnDate
# => It might be better to use:
# PasswordExpiry -ge [datetime]::Now -and PasswordExpiry -le $sevenDayWarnDate
# Find the computers each user is using
$result = foreach($user in $users)
{
$temp=$user.Name
if ($comp = Get-ADComputer -Filter "Description -like '*$temp*'" -Properties Description)
{
[PSCustomObject]@{
Name = $user.Name
PasswordExpiry = $user.PasswordExpiry
ComputerName = $comp.Name
ComputerDescription = $comp.Description
}
$tmpArray= @()
$tmpArray= $comp.Name.Split(" ")
foreach($item in $tmparray)
{
$computerArray += $item
}
$tmpArray = $Null
# }
}
continue
}
foreach($computer in $computerArray)
$tmpMessage =
$tmpMessageTitle =
{Send-RDUserMessage -HostServer $env:COMPUTERNAME -UnifiedSessionID 1 -MessageTitle $tmpMessageTitle -MessageBody $tmpMessage
}
$result | Format-Table
}
【问题讨论】:
-
发布了更多代码。我正在尝试将一个变量中的名称与另一个变量中的描述进行比较。取相同的对象,取不同的字段,一个是用户名,一个是计算机名。然后我打算向正在使用的用户发送消息(“ Send-RDUserMessage -HostServer “计算机” -UnifiedSessionID 1 -MessageTitle “来自管理员的消息” -MessageBody “Test 1”)对不起,这是第一次我真的使用 powershell 来收集基本信息,我可能很难解释。
-
所以您希望将
$user数组与$computer一起加入。$computer的Description属性有用户名或者你怎么知道哪台计算机属于哪个用户? -
正确,从它的声音。所以我试图将密码在 7 天内到期的用户与那里的计算机名称进行匹配。
-
我曾一度试图从描述中删除 -##### 但没有运气。这样我就可以翻转 $7 和 $comp 我认为可能会解决问题,但我不确定。
-
您确定要这个:
PasswordExpiry -EQ $SevenDayWarnDate吗?这意味着您只会找到具有该确切日期的用户,使用范围不是更有意义吗?即:从这个日期到$SevenDayWarnDate
标签: powershell variables scripting popup output