Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » PowerShell

Модерирует : KLASS, IFkO

KLASS (06-03-2018 00:43): Объединение тем по сценариям: Сценарии Windows
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

   

Uriu

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Версии

PowerShell 1.0 -  На текущий момент совершенно неактуальная версия, интересная только для истории. /Прямые ссылки/
PowerShell 2.0 и WinRM 2.0 - Последняя версия, работающая на Windows XP и Windows 2003 (Ещё) /Прямые ссылки/
PowerShell 3.0 (Windows Management Framework 3.0)
PowerShell 4.0 (Windows Management Framework 4.0)
PowerShell 5.0 (Windows Management Framework 5.0)
PowerShell 5.1 (Windows Management Framework 5.1)
PowerShell Core 6.0 (не заменяет PowerShell 5.1)



Ассоциация

Что бы ассоциировать скрипты с PowerShell, аналогично выполнению .bat/.cmd-файлов
нужно в командной строке набрать следующую команду(ы)
Версии 1.0-5.1 для 32-битных ОС: ftype microsoft.powershellscript.1=%windir%\system32\windowspowershell\v1.0\powershell.exe -file "%1"  
%*
 
Версии 1.0-5.1 для 32-битных ОС: ftype microsoft.powershellscript.1=%windir%\sysWOW64\windowspowershell\v1.0\powershell.exe -file "%1"  
%*
 
Версия 6.0 дя 32-битной ОС: ftype microsoft.powershellscript.1="C:\Program Files (86)\PowerShell\6.0.0\pwsh.exe"  -file "%1" %*
Версия 6.0 дя 64-битной ОС: ftype microsoft.powershellscript.1="C:\Program Files\PowerShell\6.0.0\pwsh.exe"  -file "%1" %*



вопрос о подписи скриптов

Что бы PowerShell не задавал вопрос о том, что скрипты не подписаны, ввести в нем команду
set-executionpolicy unrestricted
или в командной строке
powershell Set-ExecutionPolicy Unrestricted -force
(для этих 2-х действий требуются административные права)



Прочее


  • Если используете "белый список" в брандмауэре Windows, то для работы сценариев в сети необходимо создать 2 исходящих правила для svchost.exe и PowerShell.exe.
  • В отличие от батников кодировка скриптов на PowerShell должна быть 1251 (ANSI)




Расширение возможностей PowerShell
Функции
* Write-Color
* PowerTab --- Расширение функций клавиши Tab
Провайдеры
Готовые скрипты
* Ошибки и предупреждения в журнале событий по электронной почте (в4.0)
 


Работа со сценариями в Windows PowerShell
Раздел в MSDN
Краткие справочники по Windows PowerShell 3.0 (english)
Windows PowerShell Франк Кох (БЕРН)  Разработчик и пропагандист платформы. На русском языке в формате pdf и doc

Всего записей: 340 | Зарегистр. 25-11-2004 | Отправлено: 07:13 23-03-2006 | Исправлено: KapralBel, 09:31 29-01-2018
Merlin2006

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день!
Очень нужна помощь, бо сам не справлюсь (знаний не хватает).
Есть 2 скрипта на ps. Один выводит в файл информацию о входах в терминальную сессию, другой о выходах. Есть общее поле TargetLogonId. Хочется объединить эти два скрипта, чтобы выводилась информация о начале сессии, ее конце, продолжительность и т.п., т.е. как-то объединить два выходящих файла (в них есть вся мне необходимая информация).
Может кто-нибудь помочь? Могу выложить код.
Или может у кого-нибудь есть готовые решения?
Спасибо.

Всего записей: 1226 | Зарегистр. 20-07-2009 | Отправлено: 18:57 23-06-2016 | Исправлено: Merlin2006, 22:23 14-07-2016
dirigar

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вообще уже что-то похожее у меня было. модифицировал не много. Может ещё самому пригодится.

Код:
 
 
function Get-TSSession {
param (
 
    [string]$XPath =  @"
    *[
    System[(EventID=4624) or (EventID=4634)] and  
    EventData[(Data[@Name='LogonType']=2) or  
        (Data[@Name='LogonType']=10)]
    ]
"@,
    [Parameter(
    ValueFromPipeline=$True,
    ValueFromPipelineByPropertyName=$True)]
    $ComputerName = $env:COMPUTERNAME
    )
    process {
        Get-WinEvent -LogName security -ComputerName $ComputerName -FilterXPath $XPath  `
        | % { [xml]$_.ToXml()} `
        | select @{n="EventID";e={$_.Event.System.EventID}},
            @{n="ComputerName";e={$_.Event.System.Computer}},
            @{n="TimeCreated";e={$_.Event.System.TimeCreated.SystemTime | Get-date}},
            @{n="TargetUserSid";e={$_.Event.EventData.SelectSingleNode("*[@Name=""TargetUserSid""]").innertext}},
            @{n="TargetUserName";e={$_.Event.EventData.SelectSingleNode("*[@Name=""TargetUserName""]").innertext}},
            @{n="TargetDomainName";e={$_.Event.EventData.SelectSingleNode("*[@Name=""TargetDomainName""]").innertext}},
            @{n="TargetLogonId";e={$_.Event.EventData.SelectSingleNode("*[@Name=""TargetLogonId""]").innertext}},
            @{n="LogonType";e={$_.Event.EventData.SelectSingleNode("*[@Name=""LogonType""]").innertext}},
            @{n="IpAddress";e={$_.Event.EventData.SelectSingleNode("*[@Name=""IpAddress""]").innertext}},
            @{n="LogonGuid";e={$_.Event.EventData.SelectSingleNode("*[@Name=""LogonGuid""]").innertext}} `
        | Group-Object -Property TargetLogonId `
        | % {
            $logoff = $_.Group | ? EventID -eq 4634
            $login = $_.Group | ? EventID -eq 4624
            $out = if ($login) { $login | select * -ExcludeProperty "EventId","TimeCreated"  
            } else { $logoff | select * -ExcludeProperty "EventId","TimeCreated" }
            $out | select *, @{n="LoginTime";e={$login.TimeCreated}},
            @{n="LogoffTime";e={$logoff.TimeCreated}},
            @{n="TimeElapse";e={
                if ($logoff.TimeCreated -and $login.TimeCreated) {
                    $d = (get-date $logoff.TimeCreated) - (get-date $login.TimeCreated)
                    if ($? ) {
                        $d.ToString("c")
                    }
                }
            }};
        }
    }
}
 
 
#Example
# "server1","server2" | Get-TSSession
 

Всего записей: 7 | Зарегистр. 13-12-2013 | Отправлено: 22:30 17-07-2016
Merlin2006

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
dirigar

Спасибо, но у мене не пошло.. точнее ничего не выдало...

Всего записей: 1226 | Зарегистр. 20-07-2009 | Отправлено: 12:45 19-07-2016
Treest

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток, уважаемые форумчане, прошу помочь с одним скриптиком, который слепил с частей и по непонятным причинам он отказывается работать. Скрипт должен копировать все файлы, дата изменения которых меньше указанной с сохранением иерархии папок в другой каталог :

Код:
 
$src = "C:\Users\user1\desktop\tmp2"
$dest = "C:\Users\user1\desktop\tmp1"
$filtr = (Get-Date).AddYears(-1)
 
$files = Get-ChildItem $src -recurse | Where-Object {$_.LastWriteTime -lt $filtr}
 
foreach ($file in $files){
    $DestFile=$file.FullName.Replace("tmp2","tmp1")
    Copy-Item $file.FullName -destination $DestFile -force
}
 

 
При параметрах -gt и-ge все чудесно копируется, но мне нужно отобрать именно старые файлы, при параметрах -lt / le выдается ошибка, что  

Цитата:
Copy-Item : Не удалось найти часть пути "C:\Users\user1\desktop\tmp1\2\1.txt" (полный путь к файлу).

 
Идей нет, что делать и чем так отличается копирование для разных выборок, помогите, пожалуйста.

Всего записей: 1 | Зарегистр. 22-08-2015 | Отправлено: 16:10 20-07-2016
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть в сети скрипт PowerShell, который проверяет внешний IP и, если тот изменился шлет письмо. Проблема в том, что данный скрипт выдает внешний IP провайдера, а мне надо внешний, динамический IP роутера, который выдает провайдер. Команда ping -r 1 -n 1 www.yandex.ru выдает именно внешний IP роутера, выданный провайдером в строчке Маршрут

Цитата:
 
Обмен пакетами с www.yandex.ru [5.255.255.5] с 32 байтами данных:
Ответ от 5.255.255.5: число байт=32 время=64мс TTL=53
    Маршрут: 172.27.x.x
 
Статистика Ping для 5.255.255.5:
    Пакетов: отправлено = 1, получено = 1, потеряно = 0
    (0% потерь)
Приблизительное время приема-передачи в мс:
    Минимальное = 64мсек, Максимальное = 64 мсек, Среднее = 64 мсек
 

Как то можно все это прикрутить, чтобы слать письмо при смене IP?
Спасибо.

Всего записей: 11450 | Зарегистр. 12-10-2001 | Отправлено: 10:21 22-07-2016
kirsha

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KLASS
 
Если нужно выделить IP из строки "Маршрут: 172.27.x.x"

Код:
($Rout = ping -r 1 -n 1 www.yandex.ru) | Out-Null
$new_ip = ($Rout | Select-String '(Маршрут: )(\S+)').Matches.Groups.Value[2]

 
Добавлено:
или так  

Код:
$new_ip = ($Rout | Select-String '(\D+:\s)(\S+)').Matches.Groups.Value[2]

Всего записей: 711 | Зарегистр. 05-12-2008 | Отправлено: 15:28 22-07-2016
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kirsha
Работает! Выбрал 2 вариант... по-симпатичней.
=============
Доработанный вариант для ботов здесь оставил.
Отправить сообщение при смене внешнего IP роутера
Заменить мыло и пароль на свои.
Суем скрипт в планировщик заданий.

Всего записей: 11450 | Зарегистр. 12-10-2001 | Отправлено: 04:28 23-07-2016 | Исправлено: KLASS, 09:59 23-07-2016
kirsha

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KLASS
 
Так как вместо WebClient используется ping, то и объект создавать не нужно.
 
Эта строка лишняя (бесполезная):

Код:
 $web=New-Object net.webclient

Всего записей: 711 | Зарегистр. 05-12-2008 | Отправлено: 09:38 23-07-2016
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kirsha
Понял, убрал.
Еще мысль посетила автоматизировать до конца, а мозгов не хватает. Наберусь наглости спрошу еще.
Пришло письмо с темой измененного IP. Почтовик Bat может выплюнуть
нужную информацию в файл в таком вот виде:

Цитата:
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
From:    KLASS <tudr74@gmail.com>
To:      klass@bk.ru <klass@bk.ru>
Date:    Saturday, July 23, 2016, 9:36:00 AM
Subject: 172.27.43.219
Files:   Message01.eml
--====----====----====----====----====--
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 

Как можно используя Powershell прочесть из этого файла IP и сунуть эту инфу в известный текстовый файл
%UserProfile%\AppData\Roaming\Microsoft\Network\Connections\Pbk\rasphone.pbk
У меня это соединение по VPN с офисом.
В файле rasphone.pbk есть строка

Цитата:
 
PhoneNumber=172.27.43.219
 

т.е. заменить полученный по почте IP в файле rasphone.pbk, тогда получим почти "статический" IP адрес у роутера в Офисе

Всего записей: 11450 | Зарегистр. 12-10-2001 | Отправлено: 10:12 23-07-2016 | Исправлено: KLASS, 10:18 23-07-2016
kirsha

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KLASS
 
Это часть файла?
Наверное лучше было бы глянуть на содержимое этих файлов сразу, чтобы избежать косяков, а так почти то же самое.

Всего записей: 711 | Зарегистр. 05-12-2008 | Отправлено: 11:15 23-07-2016
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kirsha
В облако Mail.ru положил архив с обоими файлами.

Всего записей: 11450 | Зарегистр. 12-10-2001 | Отправлено: 11:32 23-07-2016
kirsha

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KLASS

Код:
$ExtIP = (gc .\ext_ip_BAT.txt | sls  '(\D+:\s)(\S+)').Matches.Groups.Value[2]
$(gc .\rasphone.pbk | foreach {if ($_ -match '^PhoneNumber=') {$_ -replace $_,"PhoneNumber=$ExtIP"} else {$_}}) | Out-File .\rasphone.pbk -Encoding OEM

Пути к файлам подставить свои.

Всего записей: 711 | Зарегистр. 05-12-2008 | Отправлено: 12:12 23-07-2016 | Исправлено: kirsha, 12:40 23-07-2016
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kirsha
Почти ровно... сам тока заметил, что в файле rasphone.pbk оказывается несколько строк содержащих фразу "PhoneNumber", всего таких строки 3
SharedPhoneNumbers=0
PreviewPhoneNumber=0
PhoneNumber=172.27.43.219
так вот все эти строки, после отработки скрипта, теперь выглядят как
PhoneNumber=172.27.43.219

Всего записей: 11450 | Зарегистр. 12-10-2001 | Отправлено: 12:36 23-07-2016 | Исправлено: KLASS, 12:42 23-07-2016
kirsha

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KLASS
 
Косяк исправил в посте выше.

Всего записей: 711 | Зарегистр. 05-12-2008 | Отправлено: 12:42 23-07-2016
KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
kirsha
Есть контакт! В разобранном виде все работает, пошел собирать, чтобы само теперь трудилось. Благодарю за помощь

Всего записей: 11450 | Зарегистр. 12-10-2001 | Отправлено: 12:50 23-07-2016
dirigar

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Спасибо, но у мене не пошло.. точнее ничего не выдало...

Merlin2006
на терминальном сервере 2008 работает, а на 2003 другие номера событий. могу только предполагать что дело в этом. еще может нету доступа к удаленному журналу через rpc

Всего записей: 7 | Зарегистр. 13-12-2013 | Отправлено: 21:58 26-07-2016
djremix



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужно при установке windows 10 передвинуть партицию влево т.е. убрать системный загрузочную партицию windows 7 в 100мб. Читал что если делать через Paragon то это очень долго. Как можно передвинуть партицию с сохранением данных. На накопителе только 2 партиции в 100мб и 111гб. Какие команды нужно ввести в командной строке. Что то я помню она называлась offset и сохраняться ли данные той партиции которая будет передвинута влево.

Всего записей: 600 | Зарегистр. 07-08-2006 | Отправлено: 22:07 05-08-2016
Scaramanga



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
del

Всего записей: 516 | Зарегистр. 24-04-2008 | Отправлено: 16:33 23-08-2016 | Исправлено: Scaramanga, 18:02 23-08-2016
q1q1



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Для просмотра пользователей в локальных группах на Windows 8.1 запускал скрипт следующего содержания:

Код:
$LocalGroup =[ADSI]"WinNT://$env:computername/Администраторы"
$UserNames = @($LocalGroup.psbase.Invoke("Members"))
$UserNames | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
 
$LocalGroup =[ADSI]"WinNT://$env:computername/Опытные пользователи"
$UserNames = @($LocalGroup.psbase.Invoke("Members"))
$UserNames | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}

 
Однако, при запуске на Windows 10 этот скрипт выдает ошибку:

Код:
Ошибка при вызове GetType. Не удалось найти элемент.
+ ...  | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $ ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: ( [], MissingMemberException
    + FullyQualifiedErrorId : System.MissingMemberException

 
Подскажите, пожалуйста, как это исправить?

Всего записей: 75 | Зарегистр. 08-01-2009 | Отправлено: 14:31 23-10-2016 | Исправлено: q1q1, 14:33 23-10-2016
PhoenixUA



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
q1q1
 

Код:
$_.GetType.Invoke().InvokeMember("Name",'GetProperty', $null, $_, $null)

 
https://mcpmag.com/articles/2015/06/18/reporting-on-local-groups.aspx

Всего записей: 2184 | Зарегистр. 17-11-2005 | Отправлено: 18:35 23-10-2016
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » PowerShell
KLASS (06-03-2018 00:43): Объединение тем по сценариям: Сценарии Windows


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru