フォローアップの質問をすることが許されていれば、古い質問を使用したでしょう。
私の質問はここと同じです: Get Logged on Users from a List of Computer Names答えは良いですが、入力の computer.csv をどのようにフォーマットする必要があるかわかりません。
フォローアップの質問をすることが許されていれば、古い質問を使用したでしょう。
私の質問はここと同じです: Get Logged on Users from a List of Computer Names答えは良いですが、入力の computer.csv をどのようにフォーマットする必要があるかわかりません。
これ (csv ファイル) は次のようにフォーマットする必要があります。
computername
server1
server2
server3
「Computername」は列名です。これは、Foreach-Object が ComputerName プロパティを参照するため、コード スニペットから派生させることができます。
わかりました...この質問は古いものですが、最近、そのドメインのすべてのワークステーションにログインした特定のドメインからすべてのユーザーをプルしなければならないという正確な問題に遭遇しました。これは、私が見つけてかなり広範囲に変更したコードのスニペットから思いついたものです。このスクリプトは Workstation.CSV ファイルからワークステーションのリストを読み取り、Excel で開くことができる適切にフォーマットされた .csv ファイルに出力します。
#
# ########################################################################################
# Script Execution is as follows
# .\LoggedOn_All.ps1
# ########################################################################################
# Script generates a list ofComputers from Active Directory and
# pulls listing of all users that have logged in to those Workstations
# Before running script, rename or delete the following files
# Workstations.csv
# Worksation_Logged_On_Users.csv
# NotPingable.csv
##########################################################################################
#Generate a listing of Workstations from Active Directory
#While this command can be run inside the script, I comment it out and copy it to powershell
#so that I can verify the contents of the file before running the script
Get-ADComputer -Filter * -SearchBase "<DISTINGUISHED NAME of the OU that contains your Workstations>" | Select -Exp Name >> Workstations.csv
#Set workstation list file (get list of workstations from file)
$list = Get-Content "<put full path here> Workstations.csv"
#Set Output file
$OUTPUT = "<put full path here> Worksation_Logged_On_Users.csv"
#set headers in CSV output file
echo "Workstation Name,User,LogonTime" | Out-File -Encoding ascii -FilePath $OUTPUT
#begin script logic
$list | ForEach-Object {
echo "Current computer $_"
#Test if system is online
Invoke-Expression "ping -n 1 -w 500 $_" | Out-Null
$ping = $LASTEXITCODE
#If Pingable perform the following collection actions
if (!$ping){
#Retrieve listings of ALL users that have logged on to the Workstation/Laptop and send results to Output File
$NetLogs = Get-WmiObject Win32_NetworkLoginProfile -ComputerName $_
foreach ($NetLog in $NetLogs) {
if ($NetLog.Name -match "<DOMAIN>*" -AND $NetLog.LastLogon -match "(\d{14})") {
$row = "" | Select Name,LogonTime
$row.Name = $NetLog.Name
$row.LogonTime=[datetime]::ParseExact($matches[0], "yyyyMMddHHmmss", $null)
foreach ($RName in $row) {
$USR = $row.Name
$LTime = $row.LogonTime
#Write "Workstation Name, User, and TimeStamp" results to Output File
echo "$_,$USR,$LTime" >> $OUTPUT }
}
}
} else {
#If System is not pingable, the System Name is written to the NotPingable.csv file
echo "$_ not pingable"
echo "$_" >> NotPingable.csv
}
}
これを試して
function Get-MyLoggedOnUsers
{
param([Array]$Computer)
Get-WmiObject Win32_LoggedOnUser -ComputerName $Computer |
Select __SERVER, Antecedent -Unique |
%{"{0} : {1}\{2}" -f $_.__SERVER, $_.Antecedent.ToString().Split('"')[1], $_.Antecedent.ToString().Split('"')[3]}
}
$Computers = gc C:\Temp\Computers.txt
Get-MyLoggedOnUsers $Computers
-また-
これを見つけて、自分のニーズに合わせて修正しました
<#
.Synopsis
Queries a computer to check for interactive sessions
.DESCRIPTION
This script takes the output from the quser program and parses this to PowerShell objects
.NOTES
Name: Get-LoggedOnUser
Author: Jaap Brasser
Version: 1.1
DateUpdated: 2013-06-26
.LINK
http://www.jaapbrasser.com
.PARAMETER ComputerName
The string or array of string for which a query will be executed
.EXAMPLE
.\Get-LoggedOnUser.ps1 -ComputerName server01,server02
Description:
Will display the session information on server01 and server02
.EXAMPLE
'server01','server02' | .\Get-LoggedOnUser.ps1
Description:
Will display the session information on server01 and server02
#>
param(
[CmdletBinding()]
[Parameter(ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true)]
[array[]]$ComputerName = (gc C:\Temp\TSRA.txt)
)
process {
foreach ($Computer in $ComputerName) {
quser /server:$Computer | Select-Object -Skip 1 | ForEach-Object {
$CurrentLine = $_.Trim() -Replace '\s+',' ' -Split '\s'
$HashProps = @{
UserName = $CurrentLine[0]
ComputerName = $Computer
}
# If session is disconnected different fields will be selected
if ($CurrentLine[2] -eq 'Disc') {
$HashProps.SessionName = $null
$HashProps.Id = $CurrentLine[1]
$HashProps.State = $CurrentLine[2]
$HashProps.IdleTime = $CurrentLine[3]
$HashProps.LogonTime = $CurrentLine[4..6] -join ' '
} else {
$HashProps.SessionName = $CurrentLine[1]
$HashProps.Id = $CurrentLine[2]
$HashProps.State = $CurrentLine[3]
$HashProps.IdleTime = $CurrentLine[4]
$HashProps.LogonTime = $CurrentLine[5..7] -join ' '
}
New-Object -TypeName PSCustomObject -Property $HashProps |
Select-Object -Property UserName,ComputerName,SessionName,Id,State,IdleTime,LogonTime
} | Out-GridView -Title "Users Logged in $Computer"
}
}