사용자가 마지막으로 로그온 한 컴퓨터를 찾는 가장 좋은 방법은?


23

Active Directory의 어딘가에 "[computer]에서 마지막으로 로그온"이 기록 / 저장되거나 구문 분석 할 수있는 로그가 있기를 바랍니다.

마지막으로 로그온 한 PC를 알고 자하는 목적은 네트워크를 통한 원격 지원을 제공하기위한 것입니다. 사용자가 자주 이동하지는 않지만, 제가 상담하고있는 내용이 그날 아침에 업데이트되었을 때 (로그인 할 때) 알고 싶습니다. 아마도) 최소한.

또한 사용자와 컴퓨터 이름을 참조 할 수있는 알려진 위치에 기록하는 로그인 스크립트를 고려하고 있지만 일부 사용자는 한 번에 15 일 동안 로그 아웃하고 싶지 않습니다.

로그인 스크립트를 사용하는 우아한 솔루션이 있다면 분명히 언급하십시오. 그러나 스테이션의 잠금을 해제하기 위해 작동하는 경우 더 좋습니다.

답변:


26

로그온 스크립트의 일부로 사용자 당 하나의 로그 파일을 사용하여 서버의 숨겨진 공유에 해당 정보 등을 기록했습니다. 로그 오프 스크립트는 사용자가 동일한 로그 파일에 로그 오프 한 시간을 추가합니다. 설정이 쉽고 비용이 들지 않으며 정보를 읽기 쉬운 형식으로 제공합니다.


또한 로그에 추가하면 과거 기록을 얻을 수있어 매우 편리합니다.
John Gardeniers

1
지금은 이것을 구현하여 아마도 미래에 더 많은 기능을 가진 vbs로 옮길 것입니다 :) 지금까지 매우 간단한 배치 로그온 스크립트를 사용하여 : echo % date %, % time %, % username %, logon, % computername % >> \\ server \ logon $ \ logons.csv Excel로 열고 설정이 완료되었습니다!
개렛

로그인 스크립트가 사용자로 실행됩니까?이 경우 사용자는 로그인하여 로그를 수정할 수 있습니까?
James Yale

@James, 이것이 숨겨진 공유를 사용하여 로그를 저장하는 이유입니다. 물론 단순히 스크립트를 읽음으로써 위치를 얻을 수 있기 때문에 사용자가 얼마나 정통한지에 달려 있습니다. 현재 사용자 세트에는 문제가 없습니다. :)
John Gardeniers

1
로그온 스크립트가 데이터베이스를 업데이트 한 웹 서비스를 호출한다는 점을 제외하고는 비슷한 작업을 수행했습니다. 데이터베이스에는 현재 상태를 볼 수있는 웹 프런트 엔드가 있습니다. 그러나 모바일 사용자에게는 문제가되었습니다.
Nic

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.

6

비슷한 이유로 같은 결과를 얻어야했습니다. 어떻게 든 특정 사용자가 로그인 한 컴퓨터를 결정합니다. "사실 전에"알고 싶었고 위에서 설명한대로 사용자 로그인 스크립트를 변경할 수 없었습니다.
보안 이벤트 로그를 구문 분석하기 위해 사용자가 인증 한 DC에서 powershell을 사용했습니다.

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

.csv를 Excel 또는 즐겨 찾기 편집기로 열어서 동일한 이벤트 내에서 계정 이름 (사용자 이름)과 소스 네트워크 주소를 모두 표시하는 최신 항목을 찾으십시오.
이것은 DHCP 임대 시간 등에 따라 100 % 신뢰할 수있는 솔루션이 아닐 수도 있지만 나에게 도움이되었습니다.



4

로그온 스크립트를 사용하여 사용자 이름 (날짜 및 시간, 일부 프로그램 버전 등의 기타 정보)을 컴퓨터 설명에 씁니다. 이렇게하면 AD 사용자 및 컴퓨터에서 모든 정보를 빠르고 쉽게 가져올 수 있으며, 보너스로 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의 제안 외에 사용자가 마지막으로 로그인 한 위치를 아는 요령은 로그 집계입니다. 도메인 컨트롤러가 여러 개인 경우 모두 확인하거나 로깅을 중앙 집중화 한 다음 단일 로그를 확인해야합니다.

대부분의 타사 도구 중 일부는 모든 도메인 컨트롤러를 쿼리 할 수있을 정도로 똑똑합니다. 그러나 자신을 파싱하기 위해 스크립트를 작성하려고 생각하는 경우 로그를 중앙 집중화하기에 충분히 강력하게 주장 할 수 없습니다.


1

이상적으로는 CSIRT 팀이 조사를 지원하기 위해 다음을 캡처합니다.

워크 스테이션 이름으로 로그인 한 사용자 ID MAC 주소 IP 주소 날짜 / 타임 스탬프 로그인 유형 (rdp, 대화식 등)

그런 다음 쿼리 할 수있는 데이터베이스에 sql 명령으로 덤프하십시오. 비트와 조각이 도처에 기록되지만이를 기록하면 DHCP / WINS 서버 등에서 데이터를 가져 오는 시간이 절약됩니다.


1
"이게 도니의 컴퓨터 이름이 뭐에요?" 그러나 언젠가 우리는 그 수준에있을 것입니다 : P
Garrett

0

최신 정보를 얻는 유일한 방법은 로그를 검색하는 것입니다. Microsoft Operations Manager와 같은 도구 또는 올가미와 같은 무료 도구를 사용하여 서버에서 중앙 위치 (일반 텍스트 파일 또는 SQL 데이터베이스)로 흥미로운 이벤트 로그를 수집 한 다음 logparser 또는 SQL 쿼리와 같은 도구를 사용하여 원하는 보고서를 생성하십시오.

다른 이벤트에 대한 다른 이벤트 ID를 찾기위한 이벤트 로그 백과 사전

이 경로를 따르려면 logparser에 대한 적절한 쿼리를 작성하는 데 도움을 줄 수 있습니다.


0

과거의 참조 자료를 찾고 있다면 Motivate Systems의 Logon Central 과 같은 타사 도구를 사용해보십시오 . 모든 Active Directory 사용자 로그온을 기록하고 데이터 마이닝을위한 웹 인터페이스를 제공합니다. 또한 로그온 통계를 사용률로 변환하는 꽤 좋은 그래프도 포함되어 있습니다.


0

AD의 ind 로그인

특정 로그인이 광고 사용자 그룹의 일부인지 알아야하는 경우가 많습니다. 또는 때로는 AD 그룹을 알아야하고 모든 로그인이 누구인지 알고 싶어했습니다.

이를 달성하는 방법에는 여러 가지가 있습니다.

이 단계에 따라 로그인을 쉽게 찾을 수있는 바탕 화면에 바로 가기를 만듭니다.

START-> RUN-> rundll32 dsquery, OpenQueryWindow

이것을 사용하여 자신이 속한 모든 AD를 찾을 수 있습니다.

시작-> 설정-> 제어판-> 관리자 도구-> Active Directory 사용자 및 컴퓨터 로그인을 찾을 도메인을 선택하고 해당 도메인을 마우스 오른쪽 단추로 클릭 한 다음 "찾기"옵션을 선택하십시오.


0

위의 marcusjv의 답변에 이것을 주석으로 추가하려고했지만 평판이 없으므로 별도의 답변을 수행해야합니다.

이 식에서 -AND "소스 네트워크 주소"는 항상 TRUE로 평가됩니다.

필요한 것은 다음과 같습니다. get-eventlog "보안"| 여기서 {$ .Message-like "* username *"-AND $ .Message.contains ( "소스 네트워크 주소")}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.