ユーザーが最後にログオンしたコンピューターを見つける最良の方法は?


23

Active Directoryのどこかに、「[コンピュータ]から最後にログオンした」が書き込まれる/保存される、または解析できるログがあることを望んでいますか?

最後にログオンしたPCを知りたいのは、ネットワーク経由でリモートサポートを提供するためです-ユーザーはほとんど移動しませんが、私が相談しているのはその朝(ログインしたとき)に更新されていることを知りたいです、おそらく)少なくとも。

また、参照可能な既知の場所にユーザー名とコンピューター名を書き込むログインスクリプトも検討していますが、一部のユーザーは一度に15日間ログアウトすることを好みません。

ログインスクリプトを使用するエレガントなソリューションがある場合は、必ずそれを言及します-しかし、それがたまたまステーションのロックを解除するために動作する場合、それはさらに良いでしょう!

回答:


26

ログオンスクリプトの一部として、ユーザーごとに1つのログファイルを使用して、サーバー上の非表示の共有にその情報(およびそれ以上)を記録しています。ログオフスクリプトは、ユーザーがログオフした時間を同じログファイルに追加します。セットアップが簡単で、費用はかかりません。情報は読みやすい形式で提供されます。


さらに、ログに追加することで、履歴レコードを取得できます。これは時々非常に便利です。
ジョンガーデニアーズ

1
現時点ではこれを実装していますが、将来的にはより多くの機能を備えたvbsに移行する可能性があります:)これまでのところ、非常に単純なバッチログオンスクリプトを使用します。 \\ server \ logon $ \ logons.csv Excelで開き、設定が完了しました!
ギャレット

ログインスクリプトはユーザーとして実行されますか?その場合、ユーザーはログインしてログを変更することもできますか?
ジェームズエール

@James、これがログを保存するために隠し共有を使用する理由です。もちろん、スクリプトを読むだけで場所を取得できるため、ユーザーの知識に依存します。私の現在のユーザーのセットにはその問題はありません。:)
ジョンガーデニアーズ

1
ログオンスクリプトがデータベースを更新するWebサービスを呼び出したことを除いて、同様のことを行いました。データベースには、現在のステータスを表示するためのWebフロントエンドがありました。ただし、モバイルユーザーにとっては問題がありました。
ニック

10

ADのコンピューターオブジェクトの説明を更新するログオンスクリプトを介してこれを行います。

「認証済みユーザー」がドメイン内のコンピューターオブジェクトの説明プロパティを記述できるようにするには、カスタム制御委任を実行する必要があります。

それが完了したら、必要な情報は、必要な情報を生成し、プロパティをコンピューターオブジェクトに書き込むスクリプトだけです。このスクリプトは、ドメインにリンクされたグループポリシーオブジェクトを介してログインスクリプトとして割り当てられます。

説明フィールドにタイムスタンプ、ユーザー名、IPを入力します。タイムスタンプが最初に来るのは、説明フィールドでソートすることにより、「古い」コンピューターオブジェクトを簡単にすばやく見られるようにするためです。

出発点として使用したい場合に、このために書いたスクリプトを次に示します。

On Error Resume Next

Set objSysInfo = CreateObject("ADSystemInfo") 'Bind to AD
Set objNet = CreateObject("WScript.Network")

strCompDN = objSysInfo.ComputerName 'DN for computer, e.g. "CN=VISTAWORKSTATION,OU=Child OU Name,OU=Parent OU Name,DC=domain,DC=com"
Set objComp = GetObject("LDAP://" & strCompDN) 'IADsComputer object

strUserDN = objSysInfo.UserName 'DN for user, e.g. "CN=John Smith,OU=Child OU Name,OU=Parent OU Name,DC=domain,DC=com"
Set objUser = GetObject("LDAP://" & strUserDN) 'IADsUser object

strUsrLogin = LCase(objNet.UserName)

strNow = Now
strDateStamp = DatePart("yyyy",strNow) & _
    Right("0" & DatePart("m",strNow), 2) & _
    Right("0" & DatePart("d",strNow), 2) & _
    "@" & _
    Right("0" & DatePart("h",strNow), 2) & _
    Right("0" & DatePart("n",strNow), 2)

'RegExp object used to perform a simple match on IP address
Set objRE = New RegExp
objRE.IgnoreCase = True
'Note this regexp pattern isn't "correct" for matching an IPv4 address properly, but since WMI will return an
'array of IP addresses, this is sufficient to distinguish IPv4 vs IPv6
objRE.Pattern = "^\d+\.\d+\.\d+\.\d+$"

strIP = ""

'Connect to WMI and retreive all network adapters
Set objWMI = GetObject("winmgmts:")
Set colNICs = objWMI.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration")

'Get the IP(s) assigned to whichever network adapter has our default gateway
If colNICs.Count > 0 Then
    For Each objNIC in colNICs
        If IsArray(objNIC.DefaultIPGateway) Then
            arrIP = objNIC.IPAddress
            For i = 0 To UBound(arrip)
                If objRE.Test(arrIP(i)) Then strIP = strIP & " " & arrIP(i)
            Next
            strMAC = objNIC.MACAddress
        End If  
    Next
End If

strIP = Trim(strIP)

objComp.Description = strDateStamp & " " & strUsrLogin & " " & strIP
objComp.Put "extensionAttribute1", strUsrLogin
objComp.Put "extensionAttribute2", strIP
objComp.Put "extensionAttribute3", strMAC

objComp.SetInfo

認証されたユーザーがADの説明フィールドオブジェクトに明示的にアクセス許可を委任する方法
NULL.Dude

6

同様の理由で同じ結果を達成する必要がありました。特定のユーザーがどのマシンからログインしたかを何らかの方法で判断します。「事実の前」を知りたかったので、上記のようにユーザーログインスクリプトを変更できませんでした。
セキュリティイベントログを解析するために、ユーザーが認証を行っているDCでPowerShellを使用しました。

get-eventlog "Security" | where {$_.Message -like "*Username*" -AND "Source Network Address"} | export-csv C:\Temp\test.csv

Excelまたはfavエディターで.csvをクラックし、同じイベント内のアカウント名(ユーザー名)とソースネットワークアドレスの両方を示す最新のエントリを探します。
これは100%信頼できるソリューションではないかもしれません(DHCPリース時間などに依存します)が、私にとってはうまくいきました。



4

ログオンスクリプトを使用して、コンピューターの説明にユーザー名(および日付や時刻などのその他の情報、一部のプログラムバージョンなど)を書き込むだけです。そうすれば、AD Users&Computersからすべての情報をすばやく簡単に取得できます。また、ボーナスとして、ADに残っているPCがしばらく使用されていない(したがって、死んだマシンである可能性が高い)ことがわかります。


3

ThatGraemeGuy、すばらしいスクリプトをありがとう!PowerShellで書き直す必要がありましたが、それでも機能します。

$CompDN = "(&(objectCategory=computer)(objectClass=computer)(cn=$env:COMPUTERNAME))"
$strCompDN = [string]([adsisearcher]$CompDN).FindOne().Properties.distinguishedname
$objComp = [ADSI]("LDAP://"+$strCompDN)

# quit if computer is a server or DC
if (($strCompDN -like '*Controller*') -or ($strCompDN -like '*SERVER*')) { exit }

$strUsrLogin = $env:username
$strDateStamp = Get-Date -f 'yyyy-MM-dd@HH:mm'
$IPPattern = "^\d+\.\d+\.\d+\.\d+$"

$colNICs = gwmi Win32_NetworkAdapterConfiguration
if ($colNICs.Count -gt 0) {
foreach ($objNIC in $colNICs){
        if ($objNIC.DefaultIPGateway) {
            $arrIP = $objNIC.IPAddress
            for ($i=0; $i -lt $colNICs.Count; $i++) { 
            if ($arrIP[$i] -match $IPPattern) { $strIP = $arrIP[$i]; $strMAC = $objNIC.MACAddress }
            }
        }
    }
}

$objComp.Description = $strDateStamp + " - " + $strUsrLogin + " - " + $strIP
$objComp.extensionAttribute1 = $strUsrLogin
$objComp.extensionAttribute2 = $strIP
$objComp.extensionAttribute3 = $strMAC
$objComp.SetInfo()

2

Adamからの提案は別として、ユーザーが最後にログインした場所を特定するための秘Theは、ログの集計です。複数のドメインコントローラーがある場合は、それらすべてを確認するか、ログを集中管理してから単一のログを確認する必要があります。

一部の、おそらくほとんどのサードパーティ製ツールは、すべてのドメインコントローラーを照会できるほどスマートです。しかし、スクリプトを記述して自分で解析することを考えているのであれば、ログを集中管理することについて十分に議論することはできません。


1

理想的には、CSIRTチームが調査を支援するために次の情報を収集します。

ワークステーション名でログインしているユーザーID MACアドレスIPアドレス日付/タイムスタンプログインタイプ(rdp、interfactiveなど)

次に、それをsqlコマンドにダンプして、クエリ可能なデータベースに入れます。断片はすべての場所でログに記録されますが、これを記録すると、DHCP / WINSサーバーなどからデータを引き出す時間を節約できます。


1
これは「ねえ、ドニーのコンピューター名は?」ではちょっとやり過ぎだと思います。でもいつかはそのレベルになるでしょう:P-
ギャレット

0

非常に最新の情報を取得する唯一の方法は、ログの採餌です。Microsoft Operations Managerなどのツールまたはスネアなどの無料ツールを使用して、サーバーから興味深いイベントログを中央の場所(通常のテキストファイルまたはSQLデータベース)に集約し、logparserやSQLクエリなどのツールを使用して必要なレポートを生成します。

さまざまなイベントのさまざまなイベントIDを見つけるために、 イベントログ百科事典を参照

このルートをフォローしたい場合は、ログパーサーの適切なクエリを作成するのを手伝ってください。


0

過去の参考資料を探している場合は、Motivate SystemsのLogon Centralなどのサードパーティツールを試してください。すべてのActive Directoryユーザーログオンを記録し、データマイニング用のWebインターフェイスを提供します。また、ログオン統計を使用率に変換する非常に優れたグラフも含まれています。


0

ADのindログイン

多くの場合、特定のログインが広告ユーザーグループの一部であるかどうかを知る必要があります。または、ADグループを知る必要があり、すべてのログインがそのグループに属している人を知りたい場合があります。

これを実現するには、さまざまな方法があります。

この手順に従ってデスクトップにショートカットを作成し、ログインを簡単に見つけることができます。

START-> RUN-> rundll32 dsquery、OpenQueryWindow

これを使用して、所属するすべてのADを見つけることができます。

[スタート]-> [設定]-> [コントロールパネル]-> [管理ツール]-> [Active Directoryユーザーとコンピューター]ログインを検索するドメインを選択し、そのドメインを右クリックして[検索]オプションを選択します。


0

上記のmarcusjvの答えへのコメントとしてこれを追加するつもりでしたが、評判がわからないので、別の答えが必要です:

その式では-AND "Source Network Address"は常にTRUEと評価されます

必要なのはget-eventlog "Security" | where {$ .Message -like "* username *" -AND $ .Message.contains( "Source Network Address")}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.