web-dev-qa-db-ja.com

過去30日間にログインしたコンピュータをActive Directoryで検索する

ADのPowerShell検索を実行して、過去30日以内にログインしたコンピューター(サーバーなどではない)のみを検索しようとしています。私は、30日間の制限を除いて、ほとんどのスクリプトを記述しています。どんな助けでも大歓迎です。

Get-ADComputer -Filter * -Properties * | FT名、OperatingSystem、LastLogonDate -Autosize | Out-File C:\ Temp\ComputerLastLogonDate.csv

7
Norrec

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が処理するデータが少なくなります。

また、次のようなコンピュータを扱う必要があることに注意してください。

  • (null)LastLogonDateを持っている
  • LastLogonDateが1/1/1601、つまりエポックの始まりである。
15
Ryan Ries

コマンドは、ワークステーションのみをフィルタリングすることはありません。

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

これに関しては、次の参考資料も参照してください。

LastLogonTimeStamp属性/それが何のために設計されたか

TimeStampをDateTimeに変換

2
Appleoddity

これで、行きたい方向に進むことができます。

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
0
Confusias

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ファイルにエクスポートした後は簡単に削除できます。追伸:このツールの所有者であり開発者です。

0
Klavs