ADのPowerShell検索を実行して、過去30日以内にログインしたコンピューター(サーバーなどではない)のみを検索しようとしています。私は、30日間の制限を除いて、ほとんどのスクリプトを記述しています。どんな助けでも大歓迎です。
Get-ADComputer -Filter * -Properties * | FT名、OperatingSystem、LastLogonDate -Autosize | Out-File C:\ Temp\ComputerLastLogonDate.csv
Get-ADComputer -Filter * -Properties *
使用する予定のプロパティのみを取得します...より効率的です。すべてのプロパティが本当に必要ない場合に、ドメイン内のすべてのコンピューターのすべてのプロパティを取得することは、ドメインコントローラーに不必要に要求することです。それは無駄です。
_Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate
_はallプロパティを必要としないため、優れています。 ( 'Name'プロパティは常に含まれます。)
| FT名、OperatingSystem、LastLogonDate -Autosize
最後まで出力をフォーマットしないでください。つまり、Format-TableとFormat-Listは、データのパイプ先となるコマンドレットのチェーン全体の最後のコマンドレットである必要があります。
Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate | Where { $_.LastLogonDate -GT (Get-Date).AddDays(-30) }
これは少し優れていますが、allコンピュータのデータセットを取得しているため、非効率性がまだあります...ドメインコントローラにフィルタリングを実行させることができます。
$LastMonth = $(((Get-Date).AddDays(-30)).ToFileTime())
Get-ADComputer -LDAPFilter "(lastLogonTimeStamp>=$LastMonth)" -Properties OperatingSystem,LastLogonDate
ここでlastLogonTimeStampを使用したのは(.NET DateTimeではなく「ファイル時間」です)、「LastLogonDate」は実際のLDAP属性ではないためです。 LastLogonDateは、PowerShellのlastLogonTimestamp属性を自動的に変換する便利な方法です。 lastLogonTimestampは、「実際の」LDAP属性です。
ドメインコントローラーがすべてのコンピューターの完全なセットの代わりにフィルターされたセットをユーザーに返すことを許可すると、ネットワーク経由で送信されるデータが少なくなり、PowerShellが処理するデータが少なくなります。
また、次のようなコンピュータを扱う必要があることに注意してください。
コマンドは、ワークステーションのみをフィルタリングすることはありません。
LastLogonTimeStampフィールドを使用して、簡単にフィルタリングし、DateTimeに変換してエクスポートできるようにする必要があります。
この情報は、オンラインでも簡単に入手できます。この例のように、ワークステーションのみを返すように少し変更しました。必要なプロパティのみをクエリすることに注意してください。より効率的です。また、このスクリプトに$ domain変数が含まれている理由がわかりません。それは完全に役に立たないようです。
# Gets time stamps for all computers in the domain that have NOT logged in since after specified date
# Mod by Tilo 2013-08-27
import-module activedirectory
$domain = "domain.mydom.com"
$DaysInactive = 90
$time = (Get-Date).Adddays(-($DaysInactive))
# Get all AD computers with lastLogonTimestamp less than our time
Get-ADComputer -Filter {LastLogonTimeStamp -lt $time -and OperatingSystem -notlike "*server*"} -Properties LastLogonTimeStamp,OperatingSystem |
# Output hostname and lastLogonTimestamp into CSV
select-object Name,@{Name="Stamp"; Expression={[DateTime]::FromFileTime($_.lastLogonTimestamp)}} | export-csv OLD_Computer.csv -notypeinformation
ここから参照: https://gallery.technet.Microsoft.com/scriptcenter/Get-Inactive-Computer-in-54feafde
これに関しては、次の参考資料も参照してください。
これで、行きたい方向に進むことができます。
Get-ADComputer -Properties * -Filter {
Enabled -eq $True -and
OperatingSystem -like 'Windows*' -and
OperatingSystem -notlike "Windows Server*" -and
OperatingSystem -notlike "Windows 7*"
} -SearchBase "DC=hhmtx,DC=org" | FT Name, OperatingSystem, LastLogonDate -Autosize | Out-File C:\Temp\ComputerLastLogonDate.csv
LastLogonDateは、LastLogonTimeStampの変換されたバージョンであることに注意してください。 LastLogonTimeStampは、実際のコンピューターの最終ログオン時間を最も正確に表したものではありません。デフォルトでは、14日間オフになる可能性があります。詳細- https://social.technet.Microsoft.com/wiki/contents/articles/22461.understanding-the-ad-account-attributes-lastlogon-lastlogontimestamp-and-lastlogondate.aspx
最終ログオン時間をより正確に取得したい場合は、lastLogon属性を使用する必要がありますが、すべてのドメインコントローラーに複製されないため、すべてのドメインコントローラーを反復して最新の値を取得する必要があります。前回のログオン時間を計算する必要があります。その場合のみ、「過去30/60/90日」に制限できます。
ここでは、ユーザーの最終ログオン時間を取得するためにこのアルゴリズムがどのように実現されるかの例を示します。
Import-Module ActiveDirectory
function Get-ADUserLastLogon([string]$userName)
{
$dcs = Get-ADDomainController -Filter {Name -like "*"}
$time = 0
foreach($dc in $dcs)
{
$hostname = $dc.HostName
$user = Get-ADUser $userName | Get-ADObject -Properties lastLogon
if($user.LastLogon -gt $time)
{
$time = $user.LastLogon
}
}
$dt = [DateTime]::FromFileTime($time)
Write-Host $username "last logged on at:" $dt }
Get-ADUserLastLogon -UserName username
同じ結果をより簡単かつ迅速に取得する別の方法があります。 Active Directoryレポートツール- AD FastReporter Free を試すことができます。正確な最終ログオン計算が行われます。インストールして、[コンピュータ]タブに移動し、[過去30日間ログオンしたコンピュータ]を選択して、[生成]をクリックします。結果にはDC=サーバーも含まれますが、.csv、.xlsxファイルにエクスポートした後は簡単に削除できます。追伸:このツールの所有者であり開発者です。