Войти

Показать полную графическую версию : [решено] Имя залогиненного пользователя на ПК


lox-ness
07-03-2016, 15:56
Добрый день!
Требуется узнать имя пользователя, залогиненного на ПК (домен), пробовала узнать через запрос к WMI например так:
Get-WmiObject Win32_ComputerSystem –Computer $computer -Credential $creds ....
Имя получаю, но не со всех ПК, предполагаю, что wmi не везде корректно работает или другие причины.
Ни как не могу сообразить альтернативный способ как можно узнать имя пользователя который вошел на ПК, предположение есть, что можно через реестр. но как?
Еще было хорошо все реализовать через Powershell.

greg zakharov
07-03-2016, 19:07
Глянул в WMIExplorer, который писал пару лет назад...
#requires -version 2.0
{
Add-Type -AssemblyName System.Windows.Forms

if (!(New-Object Security.Principal.WindowsPrincipal (
[Security.Principal.WindowsIdentity]::GetCurrent()
)).IsInRole(
[Security.Principal.WindowsBuiltInRole]::Administrator
)) {
[void][Windows.Forms.MessageBox]::Show(
"WMIExplorer requires administrator privileges.",
"WMIExplorer",
[Windows.Forms.MessageBoxButtons]::OK,
[Windows.Forms.MessageBoxIcon]::Information
)
return
}

[Windows.Forms.Application]::EnableVisualStyles()
#region resources
$ico = [Drawing.Icon]::ExtractAssociatedIcon(($PSHome + '\powershell.exe'))
$f_1 = New-Object Drawing.Font("Tahoma", 9, [Drawing.FontStyle]::Bold)
$f_2 = New-Object Drawing.Font("Tahoma", 8, [Drawing.FontStyle]::Bold)
$i_1 = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYA AICEAAD6AAA" + `
"AgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAEJJREFUOE9j/P//PwNJAKiBJMCArBpuE0QQjQsVhGuASGPahiaOUDG0NWANDVyhN1w8jRbZ8PgmkD" + `
"SITIJYEg9+nQBeQy7v217GjAAAAABJRU5ErkJggg=="
$i_2 = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYA AICEAAD6AAA" + `
"AgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRF////9u7YW5vY4+74rbfE4aoU/ez99u/a0mXT9+/bb4CXADOZgWIMjC2NnngO/fD9mc3//e" + `
"39+q3623DcyJgX89Zs+pj79eGF8ctQ8stQ78A04t73fLTpNWO17fT67bUc2GzZ9Ndr7rUd8MA17bUdsjyz9eCF9OGG5/D56vL68ctP7rYc9NZrQ" + `
"3PJ9eGG774v8MA06fH5////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrgGBQAAAJJJREFUKFNVjtcSgzAMBM/ggh1KGqGl917+/" + `
"+ciGwJEL5pdnWYOoNGC2dWOFtm0b7Q43XNnEpfR4pgW5T5kSAJrmHimxW5FLINxIAGRbfL3tubZJBqBxdfyFRpj1jUDKr7FChzyU LM1CiQgo6pp" + `
"QmwFKu/SlSPhe8PHuTXc8twb+D/DzT+TXy56d5f7dPnmz/1/Ab2bB7l4ZZdYAAAAAElFTkSuQmCC"
$i_3 = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYA AICEAAD6AAA" + `
"AgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRF475Q7NKHZ3qVrpuB69GF5cNZ69Fz58hk8uGPeoym6tFy4sRx5cVc7dZ89Oa Z4r1P58x8hm" + `
"xH9+2m3Lxk7th/8d6J6s9v4LdE9OeZ8uORy8Cz9eug69J19uufnYhu6ctpb4Gc9+3P5cNa4tGp6cpn79yFtKSKpZF39OaYzKIxeouneFw6boGb7" + `
"9uDgWZD8eCOn4he2b9plX5kmYRqel48d1o569CEfWJA7NR5vKyS37hJoo5079uFnolw////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAA" + `
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK4belAAAAHtJREFUKFNjsEMDDEQLKDIwsg hwC2sqw7QwC" + `
"ElLSIqKyAjCBWT5tBSY2OT1YAKMGhyqvFwqPOYMdjDdhpw6TEoMJgx2cN1i7Kz84qYMdoxQ3dZqzOpy2lJAAahuW4gTGezM9G3Au o1hAla6FmDd" + `
"RjABZQNLiG6YACHfAgASrCzzMRTKjwAAAABJRU5ErkJggg=="
#endregion resources

#region functions
function Get-Resource([String]$s) {
[Drawing.Image]::FromStream(
(New-Object IO.MemoryStream(($$ = [Convert]::FromBase64String($s)), 0, $$.Length))
)
}

function Get-NameSpaces([String]$root) {
(New-Object Management.ManagementClass(
$root, [Management.ManagementPath]'__NAMESPACE', $null
)
).PSBase.GetInstances() | % {
return (New-Object Windows.Forms.TreeNode).Nodes.Add($_.Name)
}
}

function Get-SubNameSpace([Windows.Forms.TreeNode[]]$nodes) {
foreach ($nod in $nodes) {
$nod.Nodes.Clear()
Get-NameSpaces ('root\' + $nod.FullPath) | % { $nod.Nodes.Add($_) }
}
}

function Get-ClassesNumber {
$sbLbl_1.Text = "Classes: " + $lvList1.Items.Count.ToString()
}

function Reset-AllMessages {
$lvList2.Items.Clear()
$rtbDesc, $sbLbl_2, $sbLbl_3 | % { $_.Text = [String]::Empty }
}

function Get-Description([Object]$o, [Boolean]$b) {
try {
$$ = switch ($b) { $true { [Management.MethodData]$o } $false { [Management.PropertyData]$o } }
$$ = $$.PSBase.Qualifiers['Description'].Value
$$ = $(if (![String]::IsNullOrEmpty($$)) { $$ } else { "n\a" }) + "`n`n"
}
catch {}

return $$
}
#endregion functions

$frmMain = New-Object Windows.Forms.Form
$mnuMain = New-Object Windows.Forms.MenuStrip
$mnuFile = New-Object Windows.Forms.ToolStripMenuItem
$mnuExit = New-Object Windows.Forms.ToolStripMenuItem
$mnuView = New-Object Windows.Forms.ToolStripMenuItem
$mnuSStr = New-Object Windows.Forms.ToolStripMenuItem
$mnuHelp = New-Object Windows.Forms.ToolStripMenuItem
$mnuInfo = New-Object Windows.Forms.ToolStripMenuItem
$scSplt1 = New-Object Windows.Forms.SplitContainer
$scSplt2 = New-Object Windows.Forms.SplitContainer
$tvRoots = New-Object Windows.Forms.TreeView
$lvList1 = New-Object Windows.Forms.ListView
$lvList2 = New-Object Windows.Forms.ListView
$chCol_1 = New-Object Windows.Forms.ColumnHeader
$chCol_2 = New-Object Windows.Forms.ColumnHeader
$chCol_3 = New-Object Windows.Forms.ColumnHeader
$chCol_4 = New-Object Windows.Forms.ColumnHeader
$chCol_5 = New-Object Windows.Forms.ColumnHeader
$chCol_6 = New-Object Windows.Forms.ColumnHeader
$chCol_7 = New-Object Windows.Forms.ColumnHeader
$tabCtrl = New-Object Windows.Forms.TabControl
$tpPage1 = New-Object Windows.Forms.TabPage
$tpPage2 = New-Object Windows.Forms.TabPage
$rtbDesc = New-Object Windows.Forms.RichTextBox
$imgList = New-Object Windows.Forms.ImageList
$sbStrip = New-Object Windows.Forms.StatusStrip
$sbLbl_1 = New-Object Windows.Forms.ToolStripStatusLabel
$sbLbl_2 = New-Object Windows.Forms.ToolStripStatusLabel
$sbLbl_3 = New-Object Windows.Forms.ToolStripStatusLabel
#
#common
#
$mnuMain.Items.AddRange(@($mnuFile, $mnuView, $mnuHelp))
$scSplt1, $scSplt2, $tvRoots, $lvList1, $lvList2, $tabCtrl, $rtbDesc | % {
$_.Dock = [Windows.Forms.DockStyle]::Fill
}
$scSplt1, $scSplt2 | % { $_.SplitterWidth = 1 }
$lvList1, $lvList2 | % {
$_.FullRowSelect = $true
$_.MultiSelect = $false
$_.ShowItemToolTips = $true
$_.Sorting = [Windows.Forms.SortOrder]::Ascending
}
$chCol_1.Text = "Name"
$chCol_2.Text = "Desciption"
$chCol_3.Text = "Amended"
$chCol_4.Text = "Local"
$chCol_5.Text = "Overridable"
$chCol_6.Text = "PropagatesToInstance"
$chCol_7.Text = "PropagatesToSubclass"
$chCol_1, $chCol_2, $chCol_6, $chCol_7 | % { $_.Width = 130 }
$chCol_3, $chCol_4, $chCol_5 | % { $_.Width = 70 }
$tabCtrl.Controls.AddRange(@($tpPage1, $tpPage2))
$tpPage1, $tpPage2 | % { $_.UseVisualStyleBackColor = $true }
$rtbDesc.ReadOnly = $true
$i_1, $i_2, $i_3 | % { $imgList.Images.Add((Get-Resource $_)) }
$sbStrip.Items.AddRange(@($sbLbl_1, $sbLbl_2, $sbLbl_3))
$sbLbl_1, $sbLbl_2, $sbLbl_3 | % { $_.AutoSize = $true }
$sbLbl_2.ForeColor = [Drawing.Color]::DarkMagenta
$sbLbl_3.ForeColor = [Drawing.Color]::DarkGreen
#
#mnuFile
#
$mnuFile.DropDownItems.AddRange(@($mnuExit))
$mnuFile.Text = "&File"
#
#mnuExit
#
$mnuExit.ShortcutKeys = [Windows.Forms.Keys]::Control, [Windows.Forms.Keys]::X
$mnuExit.Text = "E&xit"
$mnuExit.Add_Click({$frmMain.Close()})
#
#mnuView
#
$mnuView.DropDownItems.AddRange(@($mnuSStr))
$mnuView.Text = "&View"
#
#mnuSStr
#
$mnuSStr.Checked = $true
$mnuSStr.Text = "&Status Bar"
$mnuSStr.Add_Click({
$toggle =! $mnuSStr.Checked
$mnuSStr.Checked = $toggle
$sbStrip.Visible = $toggle
})
#
#mnuHelp
#
$mnuHelp.DropDownItems.AddRange(@($mnuInfo))
$mnuHelp.Text = "&Help"
#
#mnuInfo
#
$mnuInfo.Text = "About..."
$mnuInfo.Add_Click({
$frmInfo = New-Object Windows.Forms.Form
$pbImage = New-Object Windows.Forms.PictureBox
$lblName = New-Object Windows.Forms.Label
$lblCopy = New-Object Windows.Forms.Label
$btnExit = New-Object Windows.Forms.Button
#
#pbImage
#
$pbImage.Image = $ico.ToBitmap()
$pbImage.Location = New-Object Drawing.Point(16, 16)
$pbImage.Size = New-Object Drawing.Size(32, 32)
$pbImage.SizeMode = [Windows.Forms.PictureBoxSizeMode]::StretchImage
#
#lblName
#
$lblName.Font = $f_2
$lblName.Location = New-Object Drawing.Point(53, 19)
$lblName.Size = New-Object Drawing.Size(360, 18)
$lblName.Text = "WMIExplorer v1.01"
#
#lblCopy
#
$lblCopy.Location = New-Object Drawing.Point(67, 37)
$lblCopy.Size = New-Object Drawing.Size(360, 23)
$lblCopy.Text = "Copyright (C) 2011-2014 greg zakharov"
#
#btnExit
#
$btnExit.Location = New-Object Drawing.Point(135, 67)
$btnExit.Text = "OK"
#
#frmInfo
#
$frmInfo.AcceptButton = $btnExit
$frmInfo.CancelButton = $btnExit
$frmInfo.ClientSize = New-Object Drawing.Size(350, 110)
$frmInfo.ControlBox = $false
$frmInfo.Controls.AddRange(@($pbImage, $lblName, $lblCopy, $btnExit))
$frmInfo.FormBorderStyle = [Windows.Forms.FormBorderStyle]::FixedSingle
$frmInfo.ShowInTaskbar = $false
$frmInfo.StartPosition = [Windows.Forms.FormStartPosition]::CenterParent
$frmInfo.Text = "About..."

[void]$frmInfo.ShowDialog()
})
#
#scSplt1
#
$scSplt1.Orientation = [Windows.Forms.Orientation]::Horizontal
$scSplt1.Panel1.Controls.Add($scSplt2)
$scSplt1.Panel2.Controls.Add($tabCtrl)
$scSplt1.SplitterDistance = 60
#
#scSplt2
#
$scSplt2.Panel1.Controls.Add($tvRoots)
$scSplt2.Panel2.Controls.Add($lvList1)
$scSplt2.Panel1MinSize = 17
$scSplt2.SplitterDistance = 30
#
#tvRoots
#
$tvRoots.ImageList = $imgList
$tvRoots.Select()
$tvRoots.Sorted = $true
$tvRoots.Add_AfterExpand({Get-SubNameSpace $_.Node.Nodes})
$tvRoots.Add_AfterSelect({
$lvList1.Items.Clear()
Reset-AllMessages

if ($tvRoots.SelectedNode) {
$cur = 'root\' + $tvRoots.SelectedNode.FullPath

(New-Object Management.ManagementClass($cur, $obj)
).PSBase.GetSubclasses($enm) | % {
$lvList1.Items.Add($_.Name, 1)
}

$frmMain.Text = $cur + ' - WMIExplorer'
Get-ClassesNumber
} #if
})
#
#lvList1
#
$lvList1.LargeImageList = $imgList
$lvList1.TileSize = New-Object Drawing.Size(270, 19)
$lvList1.View = [Windows.Forms.View]::Tile
$lvList1.Add_Click({
Reset-AllMessages

for ($i = 0; $i -lt $lvList1.Items.Count; $i++) {
if ($lvList1.Items[$i].Selected) {
$path = $cur + ':' + $lvList1.Items[$i].Text
$frmMain.Text = $path + ' - WMIExplorer'
#caption
$rtbDesc.SelectionFont = $f_1
$rtbDesc.AppendText("$($lvList1.Items[$i].Text)`n$(('-' * 100))`n")
#getting class data
$wmi = (New-Object Management.ManagementClass($path, $obj)).PSBase
#extract class description and fill qualifiers table
$wmi.Qualifiers | % {
$itm = $lvList2.Items.Add($_.Name, 2)
if ($_.Name -match 'Description') {
$rtbDesc.AppendText("$($_.Value)`n`n")
$itm.SubItems.Add("See specification")
}
else { $itm.SubItems.Add($_.Value.ToString()) }
$itm.SubItems.Add($_.IsAmended.ToString())
$itm.SubItems.Add($_.IsLocal.ToString())
$itm.SubItems.Add($_.IsOverridable.ToString())
$itm.SubItems.Add($_.PropagatesToInstance.ToString())
$itm.SubItems.Add($_.PropagatesToSubclass.ToString())
}
#extract method(s) data
$wmi.Methods | % {
$rtbDesc.SelectionColor = [Drawing.Color]::DarkMagenta
$rtbDesc.SelectionFont = $f_2
$rtbDesc.AppendText("$($_.Name)`n")
$rtbDesc.AppendText((Get-Description $_ $true))
}
#extract property(ies) data
$wmi.Properties | % {
$rtbDesc.SelectionColor = [Drawing.Color]::DarkGreen
$rtbDesc.SelectionFont = $f_2
$rtbDesc.AppendText("$($_.Name + '(Type: ' + $_.Type + ', Local: ' + $_.IsLocal + ', Array: ' + $_.IsArray + ')')`n")
$rtbDesc.AppendText((Get-Description $_ $false))
}
#derivation
if ($wmi.Derivation.Count -ne 0) {
$rtbDesc.SelectionColor = [Drawing.Color]::DarkBlue
$rtbDesc.SelectionFont = $f_2
$rtbDesc.AppendText("Derivation`n")
$wmi.Derivation | % { $rtbDesc.AppendText("$($_)`n") }
}
#count methods and properties
$sbLbl_2.Text = "Methods: " + $wmi.Methods.Count.ToString()
$sbLbl_3.Text = "Properties: " + $wmi.Properties.Count.ToString()
} #if
} #for
})
#
#lvList2
#
$lvList2.Columns.AddRange(@($chCol_1, $chCol_2, $chCol_3, $chCol_4, $chCol_5, $chCol_6, $chCol_7))
$lvList2.SmallImageList = $imgList
$lvList2.View = [Windows.Forms.View]::Details
#
#tpPage1
#
$tpPage1.Controls.AddRange(@($rtbDesc))
$tpPage1.Text = "Specification"
#
#tpPage2
#
$tpPage2.Controls.AddRange(@($lvList2))
$tpPage2.Text = "Qualifiers"
#
#frmMain
#
$frmMain.ClientSize = New-Object Drawing.Size(800, 557)
$frmMain.Controls.AddRange(@($scSplt1, $sbStrip, $mnuMain))
$frmMain.Icon = $ico
$frmMain.MainMenuStrip = $mnuMain
$frmMain.StartPosition = [Windows.Forms.FormStartPosition]::CenterScreen
$frmMain.Text = "WMIExplorer"
$frmMain.Add_Load({
Get-NameSpaces 'root' | % { $tvRoots.Nodes.Add($_) }
Get-SubNameSpace $tvRoots.Nodes

$obj = New-Object Management.ObjectGetOptions
$enm = New-Object Management.EnumerationOptions

$obj.UseAmendedQualifiers = $enm.EnumerateDeep = $true
$sbLbl_1.Text = "Ready"
})

[void]$frmMain.ShowDialog()
}.Invoke()
..скорее всего цель задачи сводится к использованию Win32_LogonSession или Win32_LoggedOnUser.

DJ Mogarych
07-03-2016, 19:52
https://www.google.ru/search?q=how+to+know+the+user+who+logged+on

nokogerra
09-03-2016, 14:06
Про пош не скажу, но вот удобный метод http://sysrtfm.ru/windows-sever-2008/zaloginennye-polzovateli-na-pk-v-konsoli-active-directory-onlajn-vbs-skript/.
Потом уже можно вытащить пошем (get-aduser/get-adcomputer) кто где сидит, чтобы не искать в dsa.msc.

Iska
09-03-2016, 16:05
но вот удобный метод »
Неудобный. Совсем. И не гарантирует корректность результатов.

nokogerra
09-03-2016, 17:05
И чем он неудобный? И почему же не гарантирует корректность результатов? У меня все корректно показывает и на удобство не жалуюсь - можно увидеть общую картину в dsa или быстро получить залогиненного пользователя на определенной машине или наоборот - машину, на которую выполнил вход пользователь просто запросив значение атрибута description (или какой там есть желание использовать).

Iska
09-03-2016, 17:50
И чем он неудобный? И почему же не гарантирует корректность результатов? »
1. По какой-либо причине при входе не произошла запись в Description — до очередного входа пользователя в систему он будет «невидим».
2. По какой-либо причине при выходе не произошла запись в Description — до очередного выхода пользователя из системы он останется «в сети», вплоть до вечности.

nokogerra, главная беда этого подхода, что подобные случаи в нём совершенно не учитываются, нет никаких дополнительных периодических «проходов»-опросов, как, например, это сделано хотя бы в том же механизме «Сетевого окружения» (Browsing), где рано или поздно, но картина начинает соответствовать реальности.

Насчёт возможных претензий «такого не может быть»/«это бывает раз в сто лет» — не принимается: не просто «бывает», но и бывает стабильно и регулярно.

nokogerra
09-03-2016, 20:22
Хм, такое, конечно, может случиться, но когда групповые политики не отрабатывают "стабильно и регулярно", то не ладно что-то в датском королевстве.

Iska
09-03-2016, 21:45
…то не ладно что-то в датском королевстве. »
nokogerra, не могу с Вами спорить. Но я вовсе не про групповые политики. В стране эльфов никогда нет перебоев с электричеством, связь никогда не пропадает, и машины никогда не зависают.

Вы не поняли суть моих претензий к данному подходу: подобные ошибки в его рамках не обрабатываются в принципе. Никак. Совсем. И это очень плохо.

WindowsNT
11-03-2016, 11:31
Если вдруг это как-то поможет, я для себя делаю так:

1. Создана структура вида \\FileServer\Data\Computer_Reports\OS_Versions, Everyone: Modify
2. Скриптом на файл-сервере создаётся файл \\FileServer\Data\Computer_Reports\Empty.txt (file://\\FileServer\Data\Computer_Reports\Empty.txt)
Скрипт зашедулен на запуск от лица SYSTEM раз в пять минут. Это нужно для свежих атрибутов файла (время создания)

cmd.exe /c echo 2> D:\Data\Computer_Reports\Empty.txt

3. GPO Compliance Reports подключена к корню домена

User Configuration > Preferences > Windows Settings > Files > New > File > Replace
\\FileServer\Data\Computer_Reports\Empty.txt
\\FileServer\Data\Computer_Reports\OS_Versions\%OsVersion%_%ComputerName%_%LogonUser%.txt


Мы знаем, что GPO на рабочих станциях отрабатывает при логоне и ещё примерно каждые полтора часа.
Папка OS_Versions наполняется пустыми файлами вида "Windows 8.1_COMPUTERNAME_USERNAME.txt" с более-менее корректными метками времени.
Ссылка на папку ставится сотрудникам IT на рабочий стол. Поиск в ней осуществляется прямо в Windows Explorer. Знаешь имя пользователя - получи компьютер, и наоборот.

Чтобы эти файлы не копились бесконечно, на файл-сервере зашедулен ещё один скрипт:
(Можете их объединить, для меня они разные, так как иногда играют разные роли.)

$RetentionDepth = 60
$DataFolder = "D:\Data\Computer_Reports"
$EventHorizon = (Get-Date).AddDays(-$RetentionDepth)
Get-ChildItem $DataFolder -recurse | ?{$_.CreationTime -lt $EventHorizon} | del

Опиум
12-03-2016, 19:17
lox-ness,
это 100500 раз нужная и решенная задачка.
у меня тупо logon скрипт шлет в журнал ip, username и computername.
Ведь для каждого залогиненого всегда он исполняется. В итоге я имею в журнале не только кто залогинен, но и когда (с историей)
дешево и сердито.




© OSzone.net 2001-2012