通过利用lastLogonTimestamp属性

时间:2016-05-29 16:21:57

标签: powershell active-directory powershell-v2.0

我正在开发一个Powershell脚本来自动执行AD维护,并通过在Windows 2008 R2中利用从一个特定OU到另一个特定OU的lastLogonTimestamp属性来移动非活动AD计算机。

但是,在运行脚本时,我不断收到以下错误。我很难过,并且很感激为什么这个脚本抱怨这个。

Move-ADObject : Cannot validate argument on parameter 'Identity'. The argument is null. Supply a non-null argument and try the command again.

以下是引发上述错误的脚本部分:

### Find and all inactive computer objects

import-module activedirectory 
$domain = "XXXXX.XXXXX.XXXXX" 
$DaysInactive = 120
$time = (Get-Date).Adddays(-($DaysInactive))
$pwdset = (Get-Date).AddDays(-($DaysInactive))

### Get all AD computers with lastLogonTimestamp less than our time    
$OldComputers = Get-ADComputer -Filter {LastLogonTimeStamp -le $time} -Properties lastlogontimestamp |
Where-Object {
$_.DistinguishedName -like "OU=Source OU,DC=XXXX,DC=XXXX,DC=XXXX"
}

## Output computer accounts to be disabled to HTML table
$OldComputersLog = $OldComputers | ConvertTo-HTML lastlogontimestamp `
-title "Computer Accounts that will be deleted" `
    -head $head `
    -body "<H2><center>Moved and disabled computers for more than 120 days</center></H2>"| `
out-file C:\AD\move\OldComputers.html

### Move inactive computers to disabled OU
$OldComputers | Disable-ADAccount |Move-ADObject -TargetPath "OU=Destination OU,DC=XXXX,DC=XXXX,DC=XXXX"

3 个答案:

答案 0 :(得分:1)

看起来Disable-ADAccount没有输出ADobject。尝试添加-PassThru

$OldComputers |
Disable-ADAccount -PassThru |
Move-ADObject -TargetPath "OU=Destination OU,DC=XXXX,DC=XXXX,DC=XXXX"

答案 1 :(得分:0)

这是一个较早的thread,用于根据上次登录时间戳在特定域的OU中获取非活动计算机。

导入AD模块

Import-Module ActiveDirectory

define the time window --- we specify 90 days plus the official windows lag of 14 days

$time = (Get-Date).Adddays(-104)

检查是否存在OU并创建(如果不存在)

[string] $Path = 'OU=OUName,DC=domain,DC=com'
try
{
    if (!([adsi]::Exists("LDAP://$Path")))
    {
        #Create OU since it does not yet exist
        NEW-ADOrganizationalUnit “StaleComputers” –path “OU=SomeOU, DC=domain, DC=com”
    }
    else { Write-Debug "OU Already Exists:  $Path" }
}
catch [Exception]    {
    return $_.Exception.Message
}

现在我们继续检查计算机

Get-ADComputer -Filter { LastLogonTimeStamp -lt $time } | Move-ADObject -TargetPath $Path -WhatIf

现在我们检查非活动的非活动计算机

Search-ADAccount -accountinactive -ComputersOnly | ? { $_.lastlogondate -lt $time } | Move-ADObject -TargetPath $Path -WhatIf

有一些属性可帮助您确定AD用户帐户或计算机帐户是处于活动状态还是非活动状态。这些属性是LastLogon和LastLogonTimeStamp。

另一方面,为了怀疑潜在的帐户处于非活动状态,您可以执行以下步骤 - :

- 检查计算机帐户密码在相当长的一段时间内未重置的用户帐户,例如30天,60天或90天。 - 获取表中所有未在90天内重置密码的计算机列表,包括名称,专有名称和密码最后设置日期和时间。 - 您还可以使用以下“dsquery”命令来检测AD中的非活动用户和计算机帐户。

要查找过去几周未登录其帐户的用户,可以运行以下dsquery命令。

dsquery user -inactive

要详细了解此链接:https://www.linkedin.com/pulse/cleaning-up-obsolete-user-computer-accounts-from-active-ajit-singh

希望这有帮助!

答案 2 :(得分:0)

导入模块ActiveDirectory

$ SourceOU =“ OU =目的地OU,DC = XXXX,DC = XXXX,DC = XXXX”

$ DestinationOU =“ OU =目标OU,DC = XXXX,DC = XXXX,DC = XXXX”

$ lldate = [DateTime] :: Today.AddDays(-90);

$ computers = Get-ADComputer -Filter‘PasswordLastSet -le $ lldate’-Searchbase $ SourceOU

foreach($ computers在$ computers中){ $ desc =“联系支持,已在$(Get-Date)-$($ computer.Description)上禁用” Set-ADComputer $ Computer-说明$ desc-启用$ false
Move-ADObject $ computer -TargetPath $ destinationOU 添加内容C:\ PShell \ computers.txt-值“找到$ computer,已移动并禁用” }