Показаны сообщения с ярлыком PowerShell. Показать все сообщения
Показаны сообщения с ярлыком PowerShell. Показать все сообщения

среда, 16 августа 2017 г.

Windows Скрипт добавления в рабочую группу новых пользователей

Что будем делать:

в Powershell из csv файла с такой структурой Name,Password,Dolzhnost,Department
будем параметрами передавать содержимое, чтобы циклом вызывать cmd-файл с указанными выше аргументами. Все лежит в одном каталоге.


LIST-USERS.TXT
Name,Password,Dolzhnost,Department
ivanov,Pa$$w0rd,dir,Filial
kruglov,Pa$$w0rd,it,Filial

ADD.CMD
//здесь устанавливаем запретить смену пароля пользователем, срок действия пароля 
//неограничен, добавляем в группу удаленного рабочего стола
// файл создаем в кодировке 866, иначе не читает русскую кодировку

net user %1 %2 /add /fullname:%3 /comment:%4 /passwordchg:no 
wmic UserAccount where name="%1" set passwordexpires=false
net localgroup "Пользователи удаленного рабочего стола" %1 /add

ADDUSERS.PS1
Import-Csv c:\bin\list-users.txt|ForEach-Object -process {
& '.\add.cmd' $_.Name $_.Password $_.Dolzhnost $_.NB
}


вторник, 14 июля 2015 г.

Windows PowerShell массовое копирование файла по папкам, с проверкой по размеру и с исключением некоторых папок

Задача: есть самописная программа, обновляемая перезаписью нового exe-файла. Установлена у более 10 пользователей в сетевую папку для каждого пользователя вида \\programs\userN\programma. Также в папку programma вложена папка install, в которой есть установочный файл с таким же именем, который требуется обновлять. Требуется из папки, в которой будет лежат новый файл и сам скрипт, запускать копирование в сетевые папки пользователей, причем в папке install не перезаписывать, обновленные файлы также не перезаписывать. То что файл обновлен, сверяем по размеру файла. Процесс нужно логировать.

Решение:
# сетевой каталог, в котором папки пользователей с программами
$PathToPrograms = "\\dfs\programs"

# файл должен лежать в каталоге запуска *.ps1
$FileForUpdate = "file.exe"

# вычисляем размер нового файла
$SizeFileForUpdate = (ls $FileForUpdate).Length

# формируем имя лога
$CurrentDate = Get-Date -Format "dd-MM-yyyy"
$PathLOG = "backup-" + $CurrentDate +".log"

# Создание пустого файла лога, с перезаписью при наличии старого
New-Item $PathLOG -ItemType file -Force

# не обновлять в папке install, не обновлять уже обновленные. Для лога печатаем полный путь и размер
ls $PathToPrograms -File $FileForUpdate -Recurse -Force | foreach `
     # исключаем файлы, в пути содержащие install
   { if( -Not ([string]$_.FullName).Contains("install") -and `
                     $_.Length -ne $SizeFileForUpdate) `
       # логирование полного пути и размера файла до копирования
       {Out-File -FilePath $PathLOG -InputObject $_.Fullname, "Было: ", $_.Length `
                                                                                         -Append -encoding unicode
     
        # логирование через конвеер, PassThru - выводит подробную информацию
        Copy-Item $FileForUpdate -Destination $_.FullName -PassThru | `
                                         Out-File -FilePath $PathLOG -Append -encoding unicode } }

пятница, 24 апреля 2015 г.

Windows PowerShell zip архивирование

Для NET 4.5 framework:
создание архива zip:
Add-Type -Assembly "System.IO.Compression.FileSystem" [System.IO.Compression.ZipFile]::CreateFromDirectory("c:\your\directory\to\compress", "yourfile.zip")

распаковка:
Add-Type -Assembly "System.IO.Compression.FileSystem"[System.IO.Compression.ZipFile]::ExtractToDirectory("yourfile.zip", "c:\your\destination")

понедельник, 30 марта 2015 г.

Windows PowerShell добавление задачи в планировщике заданий

Общие - Выполнять с наивысшими правами,
               Скрытая задача,
               Выполнять вне зависимости от регистрации пользователя (вводим пароль)
Действия - Запуск программы - Программа: powershell.exe,
Добавить аргументы: -NoLogo -ExecutionPolicy RemoteSigned -File "path_to_script\script.ps1"

PowerShell работа с датой: дни недели, текущая дата

Текущая дата:
Get-Date -Format "dd-MM-yyyy"
30-03-2015

Интересуют дни недели, для создания скрипта архивации. Взято с Technet.

if ((Get-Date).DayOfWeek -eq 1) {
#чтототам делаем
}

Выполнение просто (Get-Date).DayOfWeek вернёт текущий день в текстовом виде:

(Get-Date).DayOfWeek

Monday

1..7|ForEach{(Get-Date -Day $_).DayOfWeek}
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday


Если нужно число, вместо буквенного значения:

(Get-Date).DayOfWeek.value__
1

среда, 25 февраля 2015 г.

Windows PowerShell отправка почты НЕ на gmail

В поиске в основном примеры с gmail, и я пошел по неверному пути - указывал стандартный порт отправки 465 отдельным параметром -port 465, по аналогии как в примерах с gmail с нестандартным портом, но так отправка не работала. Оказывается нужно было убрать этот параметр -port, если порт стандартный.

$From = "user1@mail.com"
$To = "user2@mail.gov"
$Cc = "user3@gmail.com"
$Attachment = "C:\temp\backup.log"
$Subject = "Email Subject"
$Body = "Insert body text here"

# $SMTPServer = "smtp.gmail.com" для gmail нужно добавить 
параметр для альтернативного порта -port 587
# $SMTPPort = "587" для gmail. 
Если порт стандартный 465, то параметр -port не нужен

$SMTPServer = "smtp.mail.com"

Send-MailMessage -From $From -to $To -Cc $Cc -Subject $Subject `
-Body $Body -SmtpServer $SMTPServer -UseSsl `
-Credential (Get-Credential) -Attachments $Attachment

для автоматического ввода пароля при отправке

$pass = ConvertTo-SecureString "PaSsW0rD" -AsPlainText -Force  
$mycred = new-object -typename System.Management.Automation.PSCredential `
                     -argumentlist "user1@mail.com",$pass

и тогда параметр заменяем на такой

-Credential $mycred

Вариант 2
  $cred = Get-Credential
  $cred | Export-CliXml c:\temp\cred.clixml
  $cred2 = Import-CliXml c:\temp\cred.clixml

Windows PowerShell version, запуск скриптов на компьютере

Просмотр версии PowerShell

$host.version

или

$PSVersionTable.PSVersion

или

get-host

PowerShell 4 версии можно скачать здесь. Находится в составе Windows Management Framework 4.0. Для ОС Windows 7; Windows Server 2008 R2; Windows Server 2012

Для запуска скриптов нужно проверить политику выполнения скриптов. Посмотреть текущее значение политики можно командой Get-ExecutionPolicy. Политика выполнения может иметь значения:

Restricted — блокируется выполнение любых скриптов. Значение по умолчанию;
AllSigned — разрешено выполнение скриптов, имеющих цифровую подпись;
RemoteSigned — скрипты, подготовленные на локальном компьютере, можно запускать без ограничений, скрипты, загруженные из Интернета — только при наличии цифровой подписи;
Unrestricted — разрешено выполнение любых скриптов. При запуске неподписанного скрипта, который был загружен из Интернета, программа может потребовать подтверждение;
Bypass — ничего не блокируется, никакие предупреждения и запросы не появляются.

Обычно для безпроблемного выполнения скриптов достаточно задать значение RemoteSigned. Изменить текущее значение можно командой Set-ExecutionPolicy, например:

Set-ExecutionPolicy RemoteSigned -force

вторник, 24 февраля 2015 г.

Windows PowerShell парсинг лога

Есть лог такого вида:
Sa 21.Feb.2015 00:07 ERROR # 3: f:\user\a.user\Documents\очень\длинный\путь\или\символы \в\нечитаемой\кодировке\документ.doc ==> \\BACKUP\5\user\a.user\Documents\очень\длинный\путь\или\символы \в\нечитаемой\кодировке\документ.doc: Системе не удается найти указанный путь. 

Нужно создать по каждому пользователю файл со списком каталогов и файлов, которые им нужно переименовать или укоротить путь.

Для этого разобьём на массив с разделителем слэш \ ,укоротим до символа  ==>. Выбирать будем по кодам ошибок "ERROR # 3:"

$path = "c:\path\"
$log = Get-Content backup.log 

# очищаем от ранее созданных файлов
Remove-Item -Path ($path + '*')

for($i=0;$i -lt $log.count;$i++) {
   If(($log[$i] -match " ERROR # 3:") -Or ($log[$i] -match " ERROR # 123:")){
     $value = @()
     $tmp = $log[$i].split("\")
     If($tmp[3] -match "Documents"){
       for($ii=3;$ii -lt $tmp.count;$ii++) {                                               If($tmp[$ii] -match "==>") {
            # Вырезаем ==>
            $value += $tmp[$ii].Substring(0, ($tmp[$ii].length - 4))
            
            # Заново собираем
            $value = $value -join '\'
            
            # Вырезаем в конце слэш \
            $value = $value.Substring(0, ($value.length - 1))
            
            # Добавляем переход на новую строку
            $value += "`n"                                
            break
            }
            Else{
                $value += $tmp[$ii]                                     
                }
          }
       # создаем файл по логину пользователя $tmp[2].ToString()
       Add-Content -Path ($path + $tmp[2].ToString() + '.txt') -Value $value             }
   }
}