Анализируем журнал Security

 PowerShell, Windows  Комментарии выключены
Апр 092013
 

В предыдущей статье мы рассмотрели анализ журнала System на предмет ошибок. Сегодня мы рассмотрим журнал Security на предмет подключения к нашему серверу через RDP. Нам необходимо узнать кто, когда и откуда подключался к нашему серверу терминалов. Все наши сервера работают на Windows Server 2008 R2. Ниже я привожу часть скрипта, который легко можно добавить в основной, который описан в соседней статье.

$dtNow = Get-Date
$dtPrev = $dtNow.AddHours(-1)
$login = @() # Массив подключения пользователя
$logout = @() # Массив отключения пользователя
 
Get-EventLog -LogName security | Where -FilterScript {
($_.TimeWritten -le $dtNow -and $_.TimeWritten -ge $dtPrev -and $_.EventID -eq 4624 -and $_.ReplacementStrings[8] -eq 10)} | 
ForEach-Object {
	$login += New-Object PSObject -Property @{
		ComputerName = $env:ComputerName
		TimeGenerated = $_.TimeGenerated
		User = $_.ReplacementStrings[5]
		Ip = $_.ReplacementStrings[18]
		SessionID = $_.ReplacementStrings[7]
    }
}
 
Get-EventLog -LogName security | Where -FilterScript {
($_.TimeWritten -le $dtNow -and $_.TimeWritten -ge $dtPrev -and $_.EventID -eq 4634 -and $_.ReplacementStrings[4] -eq 10)} | 
 
ForEach-Object {
	$logout += New-Object PSObject -Property @{
		ComputerName = $env:ComputerName
		TimeGenerated = $_.TimeGenerated
		User = $_.ReplacementStrings[1]
		SessionID = $_.ReplacementStrings[3]
    }
}
$login
$logout
 Posted by at 12:03
Май 112012
 
PowerShell

Продолжаю цикл статей по работе с удаленными серверами. На этот раз речь пойдет о чтении журналов.
Признайтесь, как часто вы просматриваете события журналов в windows? Всякий раз забываем это делать. А что если нам на почту будут приходить письма с “ошибками” в журнале? Ведь прочитать почту всегда легче, чем заходить на сервер и читать там. Тем более, что если серверов у нас много. На помощь может прийти PowerShell. У него есть замечательная команда

Get-EventLog

Вот с ее помощью и будем анализировать журналы.
Предлагаю готовый скрипт, который необходимо повесить в шедуллер и запускать с интервалом раз в час ну или раз в сутки, кому как нравиться. Все пояснения в комментариях. Файл “server_all.txt” должен иметь структуру, как я описывал в предыдущей статье.

<# 
Скрипт для сбора "Ошибок" и "Предупреждений" из журнала "System" на удаленных серверах, указанных в файле $srv
за последний час, и отправка результата на почту admin@mycompany.com
-------------------
настройки:
см: AddHours(-1) - время за какой промежуток собирать
см: -LogName "System" -EntryType "Error" , "Warning" - журнал, и типы сообщений
настройки почты - см. в самом конце.
#>
 
cls
 
$srv = Get-Content "c:\[path]\server_all.txt"
 
$dt = Get-Date
 
$outHTML = ""
$outHTML += '<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">'
$outHTML += '<html>'
$outHTML += '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'
$outHTML += '<h2 align="center">Отчет за ' + $dt.ToString('dd/MM/yyyy HH:mm') + '</h2>'
$outHTML += '<table width="100%" border="1" cellspacing="2" cellpadding="2"  align="center">'
$outHTML += '<tr><th>№</th><th>Date</th><th>Computer</th><th>Type</th><th>EventID</th><th>Source</th><th>User</th><th>Message</th></tr>'
 
$ok = 0
 
#Забиваем массивы с данными
foreach ($var in $srv) {
 
	# проверяем на комментарий, если есть в строке #- значит это комент. или пустую строку
	if (($var -notmatch "#") -and ($var.Length -ne 0)){
 
		$out = $var -split ";"
 
		$password = $out[1] | ConvertTo-SecureString 
		$cred = New-Object System.Management.Automation.PSCredential $out[0],$password
 
		$s = $out[2] -split ","
		$session = New-PSSession -ComputerName $s -Credential $cred
 
		# выполняем запрос
		Invoke-Command -Session $session {$dtNow = Get-Date}
		Invoke-Command -Session $session {$dtPrev = $dtNow.AddHours(-1)}
		Invoke-Command -Session $session {$EventLog = get-eventlog -LogName "System" -EntryType "Error" , "Warning"}
		$result = Invoke-Command -Session $session {$EventLog | Where-Object {$_.TimeWritten -le $dtNow -and $_.TimeWritten -ge $dtPrev} }
 
		# Обработаем результат
		if ($result.Count -ge 0){
			$ok = 1
 
			for ($i=0; $i -lt $result.Count; $i++){
 
				$outHTML += '<tr align="left">'
				$outHTML += '<td>' + $i + '</td>'
				$outHTML += '<td>' + $result.SyncRoot[$i].TimeWritten + '&nbsp;</td>'
				$outHTML += '<td>' + $result.SyncRoot[$i].PSComputerName + '&nbsp;</td>'
 
				if ($result.SyncRoot[$i].EntryType -eq 'Error'){
					$outHTML += '<td bgcolor="#FF0000"><b>' + $result.SyncRoot[$i].EntryType + '</b>&nbsp;</td>'				
				}else{
					$outHTML += '<td bgcolor="#FFFF00"><b>' + $result.SyncRoot[$i].EntryType + '</b>&nbsp;</td>'				
				}
				$outHTML += '<td>' + $result.SyncRoot[$i].EventID + '&nbsp;</td>'
				$outHTML += '<td>' + $result.SyncRoot[$i].Source + '&nbsp;</td>'
				$outHTML += '<td>' + $result.SyncRoot[$i].UserName + '&nbsp;</td>'
				$outHTML += '<td>' + $result.SyncRoot[$i].Message + '&nbsp;</td>'
				$outHTML += '</tr>'
			}
		}
 
		#Выходим из сессии.
		Remove-PSSession -Session $session
	}
}
 
$outHTML += '</table></html>'
 
if ($ok -eq 1){
	# отправляем почту
	$SMTPClient          = new-object System.Net.Mail.SMTPClient 
	$Msg                 = new-object System.Net.Mail.MailMessage 
	$Msg.From            = "robot@mycompany.com" 
	$Msg.Subject         = '[Event Log] ' + $dt.ToString('dd/MM/yyyy HH:mm')
	$Msg.IsBodyHTML      = 1 
	$Msg.BodyEncoding    = [System.Text.Encoding]::UTF8
	$Msg.Body            = $outHTML
	$SMTPClient.Host     = 'host.mycompany.com' 
	$SMTPClient.Port     = 25 
	$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("robot@mycompany.com", "Pa$SWorD")
	$Msg.To.Add('admin@mycompany.com') 
	$SMTPClient.Send($Msg) 
}

В итоге на почту будет приходить письмо, примерно такого содержания:

Отчет за 11.05.2012 13:00

Date Computer Type EventID Source User Message
0 05/11/2012 13:00:04  server10  Error  56  TermDD    Описание ошибки.
1 05/11/2012 13:00:15  server3 Error  56  TermDD    Описание ошибки.

 Posted by at 18:13

Как установить 1С ver 7.7 на Windows 7/ Vista

 , Windows  Комментарии выключены
Апр 062012
 
1c

Многие, наверное, сталкивались с проблемой установки конфигураций для платформы 1С 7.7 под Windows 7 или Windows Vista … Есть масса способов распаковать дистрибутив конфигурации 7.7 под этими ОС, XP Mode, VMWare с WinXP в ней, “недокументированный” метод с периодическим запуском Центра Управления Сетями и Общим Доступом во время установки конфигурации. В данной статье представлен способ позволяющий автоматизировать этот процесс, т.е. извлечь все файлы из дистрибутива конфигурации в один клик, как будто мы его установили.

Порядок действий следующий – помещаем папки DISKx и файлы скрипта в одну папку, т.е. так как показано на картинке:
После чего запускаем extract_1c.cmd. Когда скрипт отработает автоматически создастся папка UNP, где и будет распакованная конфигурация.
Оригинал статьи

 Posted by at 16:03
Фев 292012
 
PowerShell

В предыдущей статье, я рассказал о том, как настроить выполнение команд на удаленных серверах. В показанном примере использовался одна пара логин\пароль для всех серверов. А что делать, если у нас много серверов и на каждом из них разные пароли да и к тому же они не находятся в одной сети? Выходов из этой ситуации можно найти много, но я нашел для себя оптимальный способ. Рассмотрим скрипт:

$credential=Get-Credential
$credential.Password | ConvertFrom-SecureString

или

$out = "c:\password.txt"
$credential=Get-Credential
$credential.Password | ConvertFrom-SecureString | Add-Content $out

при выполнении этих двух скриптов (необходимо ввести в открывшимся окне логин и пароль) мы получим некую строку или на экран (первый скрипт) или в файл (второй скрипт). Данная строка будет не что иной как зашифрованный пароль, который вы ввели. Вот этот самый пароль мы и будем использовать далее. Теперь создадим файл и назовем его  server_all.txt с таким содержанием:

Administrator;01000000d08c9ddf011.....7adb2;server1,server2
Administrator;01000000d08c9ddf011.....8fa35;server3,server7,server10,srv2
Administrator;01000000d08c9ddf011.....dea73;srv1

В этом файле я “обрезал” пароль, т.к. приводить его в полном варианте нет смысла. Заметьте, что у сервера с одинаковым паролем я объединил в одну строку. Это сделано умышленно для того, чтобы можно было выполнять команды параллельно на этих серверах. Далее пишем скрипт, который читает файл и выполняет одинаковые команды на этих серверах.

cls
 
$srv = Get-Content "x:\[path]\server_all.txt";
 
# Скрипт, который будем выполнять на удаленных серверах
$script_txt = "Get-Process exp*"
# Переводим его в "ScriptBlock"
$script = $executioncontext.invokecommand.NewScriptBlock($script_txt)
 
#Забиваем массивы с данными
foreach ($var in $srv) {
 
	# проверяем на комментарий, если есть в строке #- значит это коментарий.
	# или пустую строку
	if (($var -notmatch "#") -and ($var.Length -ne 0)){
 
		# разделим строку
		$tmp = $var -split ";"
 
		# преобразуем пароль
		$pass = $tmp[1] | ConvertTo-SecureString
		$cred = New-Object System.Management.Automation.PSCredential $tmp[0],$pass
 
		$s = $tmp[2] -split ","
 
		# создаем сессию
		$session = New-PSSession -ComputerName $s -Credential $cred
 
		# выполняем запрос (найдем процесс "explorer")
		$result = Invoke-Command -Session $session -ScriptBlock $script
 
		# Обработаем результат
		for ($i=0; $i -lt $result.Count; $i++){
			Write-Host $result[$i].PSComputerName,"`t",$result[$i].Name
		}
 
		#Выходим из сессии.
		Remove-PSSession -Session $session
 
	}
}

Результат работы скрипта будет следующий:

server1   explorer
server2   explorer
server3   explorer
server7   explorer
server10   explorer
srv2   explorer
srv1   explorer

Вот собственно и все.
Единственное на что хотелось бы обратить внимание, так это на то, что если перенести этот скрипт на другой компьютер (или запустить под другой учетной записью), то это работать не будет, т.к. пароли “привязываются” к учетной записи и компьютеру. И в этом есть плюс!

Загрузка CPU через PowerShell

 PowerShell, Windows  Комментарии выключены
Фев 032012
 
PowerShell

Продолжаем разговор про PowerShell

Наверное это самая распространенная команда на PowerShell

Get-Process

Результатом будет:

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
     72       8     1180         52    42     0,02   1548 armsvc
   1968      10     2248       2592    64     4,92   1104 atieclxx
    118       7     1436        988    33     0,06    816 atiesrxx

Как мы видим, она показывает список процессов в системе, но вот досада, она не показывает загрузку CPU в %  каждого процесса, вместо этого она показывает  CPU(s). Что же это такое? Давай те разбираться.

Дело в том, что  CPU(s) – это время в сек. которое потратил процессор на выполнения процесса, т.е. в моем случае процесс  7zFM всего потратил 0,45 сек. на все свою работу. Но как это можно превратить в % ? Да очень просто: надо сделать 2 замера, посчитать разницу во времени между замерами и так же посчитать разницу потраченного  времени данным процессом. Давай те рассмотрим код:

cls
 
#Узнаем сколько у нас всего ядер
$core = Get-WmiObject -Class Win32_ComputerSystem | Select-Object NumberOfLogicalProcessors
 
#Первый замер
$data_start = Get-Date
$process_start = Get-Process | Where-Object {$_.Name -contains "7zFM"} | Select-Object TotalProcessorTime
 
# "Поспим" немного и "поработаем" в данном процессе
start-sleep -Seconds 5
 
#Второй замер
$data_stop = Get-Date
$process_stop = Get-Process | where-Object {$_.Name -contains "7zFM"}
 
#Подсчитаем загрузку
$Data_delta = $data_stop.Ticks - $data_start.Ticks
$CPU_delta = $process_stop.TotalProcessorTime.Ticks - $process_start.TotalProcessorTime.Ticks
 
if ($Data_delta -gt 0 -and $CPU_delta -gt 0){
    $CPU_Load = ($CPU_delta * 100) / ($Data_delta * $core.NumberOfLogicalProcessors)
}else{
    $CPU_Load = 0
}
# Выводим результат
Write-Host $CPU_Load

В результате мы получим загрузку в %. При небольшом изменении кода можно получить загрузку по всем процессам.

 Posted by at 23:49
Янв 092012
 
PowerShell

Очень часто приходиться работать на удаленных серверах и зачастую надо выполнить простые команды – посмотреть список процессов, загрузку CPU, свободное место на дисках запустить (закрыть) программу, выполнить настройку и т.д. Чаще всего под такие цели делают удаленный вход на сервер по средствам RDP, RAdmin и т.д. Это конечно хорошо, но надо тратить время на вход, запуск консоли, копания в настройках. Давайте рассмотрим еще один способ удаленной работы. Continue reading »

 Posted by at 12:51