Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» PowerShell

Автор: Joolz
Дата сообщения: 29.09.2008 13:29
Drunken Master
Понял, что контролировать что переменная не пустая с помощью ($var.count -gt 0) низя. Если в переменной одна строчка, то результата я не получаю. Пока испоьзую ((get-variable $var).value -ne null), но это тоже как-то неправильно.

Посмотрел примеры на technet - как-то это уже мало похоже на PoSH.
Автор: Drunken Master
Дата сообщения: 29.09.2008 15:49
Joolz
может я сегодня туплю, но я снова не понял вопроса
существование переменной: Test-Path Variable:\var
на null: $var -ne $null
числа на ноль: $var -ne 0
строки на пустоту: $str -ne "" или $str.Length > 0
массивы на пустоту: $arr.Length > 0 или $arr.Count > 0
Автор: Joolz
Дата сообщения: 29.09.2008 15:59
Drunken Master
Скорее я невнятно объясняю.
На примере того же event.log'а.
Если переменная $event=gwmi Win32_NtLogEvent в результате выполнения получает 2 и более строчки из event.log'а, то $event.count можно сравнивать с численным значением, а если мы получаем одну строчку из event.log'а, то получаем что $event.count равен $null.

Кажется понял надо указывать [array]$event, иначе однострочным переменным по-умолчанию присваивается [string].
Автор: Drunken Master
Дата сообщения: 29.09.2008 16:36
Joolz
Да, если возвращается одно значение, то массив для него не создаётся. В конвейере это без разницы. А при сохранении в переменной важно. Вариантов, как положено, много:

Код: [object[]]$element = …
$element = [object[]] (…) # ага , приводим к нужному типу
$element = @(…) # тоже принудительно создаем массив
$element = @() ; $element += … # создаем пустой массив и заполняем его
Автор: Joolz
Дата сообщения: 01.10.2008 13:12
Еще задачка.
Используем redirection folder'ы (RF) для рабочего стола и документов пользователей, соответственно, при увольнении человека его RF остается на сервере и занимает место. Хочу сделать скрипт, который:
1) мог бы просканировать GPO и найти по ключевому слову Redirect (их несколько) нужные политики.
СДЕЛАЛ.
2) Извлечь из найденых политик пути где лежат RF
\\serv1\redirect
\\serv2\redirect01
\\serv2\redirect02
Сделал
3) Просканировать полученные пути и узнать владельцев папок.
\\serv2\redirect01\user12 - user12
\\serv2\redirect01\user34 - user34
\\serv2\redirect01\user38 - user38
Сделал
4) Проверить существование этих пользователей в AD, если существуют, проверить не отключены ли они, если не отключены - проверить lastlogon. Если пользователя нет, он отключен или lastlogon больше года, то создаем список пользователь - папка.
Сделал
Удалять все-таки буду вручную.

Пока застыл на получении путей.
Делал как здесь.

Код:
$gpm = New-Object -ComObject GPMgmt.GPM
$gpmConstants = $gpm.GetConstants()
$gpmDomain =$gpm.GetDomain("domain.rul", "", $gpmConstants.UseAnyDC)
$gpmAllGpos = $gpmDomain.SearchGPOs($gpmSearchCriteria)
foreach ($gpmGpo in $gpmAllGpos) {if ($gpmGpo.DisplayName -like '*Redirect *') {$gpmGpo.GenerateReport(0
).result}}
Автор: Drunken Master
Дата сообщения: 01.10.2008 16:21
Joolz

Цитата:
для GenerateReport можно указать другой GPMReportType, но что это за типы


$gpmConstants.ReportHTML (равная 1)
$gpmConstants.ReportXML (равная 0)

Собственно $gpmGpo.GenerateReport(0).result - это XML.
Делаем:

Код: $x = [xml]$gpmGpo.GenerateReport(0).Result
$x.GPO | gm # покажет всё, что там есть
Автор: sghpunk
Дата сообщения: 03.10.2008 12:39
Здравствуйте! )

Поиском вроде похожих тем не нашел.
Есть задача скопировать рекурсивно файлы из одного каталога в другой с датой не позже 01-01-2007 и скопировать права доступа, но скопировать права доступа нужно не просто, а удалив из них права записи и оставив только на чтение. Выбрал для этой задачи ПаверШелл, получился такой скрипт:

Код:
#Исключения
#$ex_files = "*.cmd,*.bat,*.txt"
#Размер
$size = 0
#Кол-во
$count = 0

# каталог, откуда копируем
#$InitialFolder = "d:\vol1\DISK_N\M_INF"
$InitialFolder = "d:\temp"
#$InitialFolder = "c:\WINDOWS"
# каталог, куда копируем
$TargetFolder = "d:\xxx"
#$TargetFolder = "o:\disk_n"
# контрольная дата (копируем файлы с датой создания раньше этой)
$ControlDate = "2007-01-01"

#Подключим сетевой диск
net use o: /delete /yes
net use o: \\io\old_fs

#Поставим на папку все родительские нследуемые права
$ACL = Get-Acl -Path $InitialFolder
$If = Get-Item -Path $InitialFolder
#Перебираем и явно указываем все наследуемые права, иначе не применятся
$ACR = $ACL.GetAccessRules($True, $True, [System.Security.Principal.NTAccount])
$ACL = New-Object System.Security.AccessControl.DirectorySecurity
for ($i = 0 ; $i -lt $ACR.Count ; $i++ ) {
if (($ACR[$i].IdentityReference.ToString() -ne "BUILTIN\Администраторы") -and ($ACR[$i].IdentityReference.ToString() -ne "NT AUTHORITY\SYSTEM"))
{
$rule=new-object System.Security.AccessControl.FileSystemAccessRule($ACR[$i].IdentityReference.ToString(),"ReadAndExecute","Allow")
} else {
$rule = $ACR[$i]
}
$ACL.AddAccessRule($rule)
}

#Сменим владельца в применяемых правах иначе права не применяются
$no = New-Object System.Security.Principal.NTAccount("Администраторы")
$ACL.SetOwner($no)
Set-Acl $TargetFolder $ACL
#exit
#while ($If.FullName -ne $If.Root.FullName) {
# $ACLP = Get-Acl -Path $If.Parent.FullName
# $If = Get-Item -Path $If.Parent.FullName
#}

Get-ChildItem -Force -path $InitialFolder -recurse -Exclude $ex_files | Where-Object -FilterScript {($_.LastWriteTime -lt $ControlDate)} | ForEach-Object -Process {
$Tpath = $_.DirectoryName.Remove(0,$InitialFolder.Length)
#Проверим существование пути, если нет, то создадим
if (!(Test-Path -Path $TargetFolder$Tpath)) {
New-Item -Path $TargetFolder$Tpath -ItemType directory -ErrorAction SilentlyContinue
#Если папка создалась, то ставим на неё права
if ($?) {
$ACL = Get-Acl -Path $_.DirectoryName
#Перебираем и явно указываем все наследуемые права, иначе не применятся
$ACR = $ACL.GetAccessRules($True, $True, [System.Security.Principal.NTAccount])
for ($i = 0 ; $i -lt $ACR.Count ; $i++ ) {
if (($ACR[$i].IdentityReference.ToString() -ne "BUILTIN\Администраторы") -and ($ACR[$i].IdentityReference.ToString() -ne "NT AUTHORITY\SYSTEM"))
{
$rule=new-object System.Security.AccessControl.FileSystemAccessRule($ACR[$i].IdentityReference.ToString(),"ReadAndExecute","Allow")
} else {
$rule = $ACR[$i]
}
$ACL.AddAccessRule($rule)
}
#Сменим владельца в применяемых правах иначе права не применяются
$ACL.SetOwner($no)
Set-Acl $TargetFolder$Tpath $ACL
} else {
echo $Error[0] > Copy_err.log
}
}
$Name = $_.Name
Copy-Item $_.FullName -Force -Destination $TargetFolder$Tpath\$Name
#Если файл скопировался, то ставим на него права
if ($?) {
$ACL = Get-Acl -Path $_.FullName
#Перебираем и явно указываем все наследуемые права, иначе не применятся
$ACR = $ACL.GetAccessRules($True, $True, [System.Security.Principal.NTAccount])
for ($i = 0 ; $i -lt $ACR.Count ; $i++ ) {
if (($ACR[$i].IdentityReference.ToString() -ne "BUILTIN\Администраторы") -and ($ACR[$i].IdentityReference.ToString() -ne "NT AUTHORITY\SYSTEM"))
{
$rule=new-object System.Security.AccessControl.FileSystemAccessRule($ACR[$i].IdentityReference.ToString(),"ReadAndExecute","Allow")
} else {
$rule = $ACR[$i]
}
$ACL.AddAccessRule($rule)
}
#Сменим владельца в применяемых правах иначе права не применяются
$ACL.SetOwner($no)
Set-Acl $TargetFolder$Tpath\$Name $ACL
} else {
echo $Error[0] > Copy_err.log
}

}
Автор: Drunken_Master
Дата сообщения: 04.10.2008 20:01
sghpunk
Для работы с путями удобно использовать класс [System.IO.Path]

Код: > [System.IO.Path] | gm -static # выводит список методов класса
> [System.IO.Path]::Combine("e:\dir", "file.txt")
e:\dir\file.txt
> [System.IO.Path]::GetDirectoryName("e:\dir\file.txt")
e:\dir
> [System.IO.Path]::GetFileName("e:\dir\file.txt")
file.txt
Автор: nepost
Дата сообщения: 07.10.2008 11:45
Перестал работать батник по запуску скрипта на PS
Батник запускается планировщиком и обновляет адресные листы эксчанги:
----------------- updaddlist.bat ----------------------

C:\WINDOWS\system32\WindowsPowerShell\v1.0\PowerShell.exe -PSConsoleFile "C:\Program Files\Microsoft\Exchange Server\bin\exshell.psc1" -command ". 'D:\scripts\updaddlist.ps1'"

Сам скрипт PS:
------------------ updaddlist.ps1 ---------------------

update-addresslist -identity 'Адрес-лист1'
get-addresslist | where-object {$_.container -gt '\'} | update-addresslist
---------------------------------------------------------

Недавно заметил, что скрипт перестал работать, выдает сообщение:
WARNING: The following errors occurred when loading console C:\Program Files\Microsoft\Exchange Server\bin\exshell.psc1: Cannot load Windows PowerShell snap-in Microsoft.Exchange.Management.PowerShell.Admin because of the following error:
No Windows PowerShell Snap-ins are available for version 1.
Command ". 'D:\scripts\updaddlist.ps1'" could not be executed because some Windows PowerShell snap-ins did not load.

При попытке запускать скрипт из bat-файла строкой:
D:\scripts\updaddlist.ps1

получаем ошибку:
File D:\scripts\updaddlist.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.
At line:1 char:2
+ &' <<<< D:\scripts\updaddlist.ps1'

Проверил безопасность:
[PS] C:\>Get-ExecutionPolicy
Unrestricted

При попытке запустить дабл-кликом мышки (ассоциации с файлом настроены) мигает окошко и сразу закрывается. Не видать, чего он там пишет.
При запуске из командной строки Exchange скрипт работает нормально.

Помогите разобраться, куда рыть (нюхом чую, что дело именно в привязке PS к Винде (ибо через эксчанговую консоль скрипт ps1 запускается и нормально работает)
Автор: Drunken_Master
Дата сообщения: 07.10.2008 18:54
nepost
Могу предположить, что вручную вы запускаете 64-битную версию PowerShell, и всё работает, а по ассоциации запускается 32-битная, в которой запрещено выполнение скриптов и нет нужных Snap-ins.
Автор: nepost
Дата сообщения: 08.10.2008 13:40
Drunken_Master
Не согласен, ибо
C:\WINDOWS\system32\WindowsPowerShell\v1.0\PowerShell.exe -PSConsoleFile "C:\Program Files\Microsoft\Exchange Server\bin\exshell.psc1" -command ". 'D:\scripts\updaddlist.ps1'"
явно указывает на 32-битный PS
Однако на всякий случай запустил 64-битный, подправил безопасность на unrestricted... не помогло...
Потом по некоторым причинам ребутнули сервак, после ребута всё заработало
Однако при запуске bat-файла из FAR - та же ошибка. При запуске из CMD или из проводника - всё работает.
Автор: Drunken Master
Дата сообщения: 08.10.2008 15:18
nepost
C:\WINDOWS\system32\WindowsPowerShell\v1.0\PowerShell.exe указывает на 64-битный (32-х лежит в SysWow64, именно так), но указывает не явно. Для каталога system32 работает перенаправление. Поэтому, когда вызывается C:\WINDOWS\system32\WindowsPowerShell\v1.0\PowerShell.exe, будет запущен PS той же разрядности, что и вызывающий процесс. Проводник 64-битный, CMD (при вызове через Win+R) тоже. А вот FAR, похоже, у вас 32-битный (а есть же и 64). Exchange консоль, по-видимому, работает только в 64-битном окружении.
Разрядность процесса легко проверить в диспетчере задач.
Автор: TCPIP
Дата сообщения: 14.12.2008 02:48
Господа, кто работал с веб с помощью PoSH? Интересует возможность автоматизации вызовов команд в веб-интерфейсе. Желательно с доступо через HTTPS. Как бы это лучше сделать?
Для начала, тупо сэмулировать щелчок кнопки на asp-странице.
Посоветуйте пожалуйста что-нибудь.
Ну, что-то вроде того, что написано в этой замечательной статье по тестированию WebUI на PoSH. Только мне не тестировать нужно, а просто автоматизировать работу с элментами управления на веб-интерфейсе.
Вот еще просто потрясающий мини-фреймворк от автора командлета Get-Web.
Как мою задачу правильно выполнить? (просто не хочется изобретать велосипед...)

Кстати, не так давно, появилась отдельная ветка по программированию на PoSH.
Как вы насчет того, чтобы с листингами там разбираться?

Drunken Master

Цитата:
Exchange консоль, по-видимому, работает только в 64-битном окружении.

Возможно, можно поставить 32-bit Management Tools, тогда SystemRedirection в WOW64 не будет включаться.
Автор: KapralBel
Дата сообщения: 24.12.2008 15:06
имеется Windows 2003 64bit Russian

Что надо что бы на него поставить ПШ?

32-битная русская ругается - о битах
64-битная (мульти/англ/локал - все равно один и тот же англ.файл) - ругается на язык
Автор: veryom
Дата сообщения: 14.02.2009 18:47
sghpunk

Цитата:
Вопрос в чём, я когда копирую права, то приходится копировать права на каждый файл и задавть их явно, хотя в источнике они все наследуются от директорий, как это сделать красивее?

А если сделать так:

Код: $AccountBase = @("BUILTIN\Администраторы", "BUILTIN\SYSTEM")

dir С:\Source -Recurse | where {$_.PSIsContainer} | foreach {
    $target=($_.FullName).Replace("C:\Source", "D:\Destination")
    $aclTar=Get-Acl $_.FullName
    $aclTar.Access | foreach {
        $Account = $_.IdentityReference.ToString()
        $Propagation = $_.PropagationFlags
        $Inheritance = $_.InheritanceFlags
        if ($AccountBase -notcontains $Account) {
            $AccessRule = new-object System.Security.AccessControl.FileSystemAccessRule($Account, "ReadAndExecute", $Inheritance, $Propagation, "Allow")
            $aclTar.SetAccessRule($AccessRule)
            $AccountBase = $AccountBase + $Account
        }
    }
    Set-Acl $target $aclTar
}
Автор: klimusu
Дата сообщения: 24.03.2009 13:20
как корректно удалить powershell 1.0
хочу поставить Windows PowerShell V2 (CTP3)
Автор: Drunken Master
Дата сообщения: 24.03.2009 13:37
klimusu
В Висте: Панель управления - программы - удаление программы - просмотр установленных обновлений - Windows PowerShell(TM) 1.0 (KB928439).
В XP/2003: в списке "Установки и удаления программ" нужно поставить флажок "Показывать обновления", после этого он будет в группе обновлений как Hotfix KB926139 (английский) или KB926140 (локализованный).
Автор: klimusu
Дата сообщения: 24.03.2009 13:50
Drunken Master
да спасибо, меня интересовала виста.. работает.

Добавлено:
Подскажите как в переменную засунуть содержимое текстового файла (несколько строк)
Автор: Drunken Master
Дата сообщения: 25.03.2009 10:05
klimusu
В массив строк:

Код: $txt = Get-Content report.txt
Автор: lynnik
Дата сообщения: 30.04.2009 11:44
2 All

есть некая соманда с параметрами
connamd -par1

как мне запустить её много раз с разными параметрами ?

connamd -par1
connamd -par3
connamd -par4
...

то есть что то типа BAT файла в котором построчно заданны команды с параметрами и они последовательно отрабатывают
Автор: rosalin
Дата сообщения: 26.05.2009 13:34
Ребята,
несочните за наглость поделитесь плиз качественным скриптом по сбору информации об установленном ПО в сети под управлением домена.
Автор: TCPIP
Дата сообщения: 06.06.2009 01:40
Господа, удалось ли кому-нибудь приспособить интерпретатор PowerShell для работы в Visual Studio (ну, кроме тупого прицепления шаблонов разумеется)? Уж больно удобно в VS пишется.
Кстати, а кто какой средой пользуется для написания PoSH-скриптов? Все-таки три года прошло, профессионалы, наверное, уже набили руку.
Спасибо.
Автор: userpuser
Дата сообщения: 08.06.2009 06:49

Цитата:
Ребята,
несочните за наглость поделитесь плиз качественным скриптом по сбору информации об установленном ПО в сети под управлением домена.


Пожалуйста, выложил, вот ссылка: http://ifolder.ru/12527971 (пароль на скач. наш стандартный).
Скрипт не мой (где-то нашёл в Инете), немного переделал под себя, сделал action для PowerGUI (юзаю его, очень нравится, для себя наделал в нем powerpackow целую кучу - бесплатно, удобно и со вкусом). Пользуйтесь на здоровье.
Автор: UserDmitry
Дата сообщения: 08.06.2009 12:56
Уважаемые коллеги!

Просьба подсказать, как можно в PowerShell узнать - снято или установлено наследование на папку?

Например, есть две папки c:\temp\1 и c:\temp\2 , для папки "1" в свойствах Security\Advanced\Permissions стоит галка напротив - Allow inheritable permissions... а у папки "2" нет. Так вот как в PowerShell проверить наличие этой галки?

У меня пока, только получилось увидеть, через наследование или нет установлен доступ для конкретных групп/юзеров:

(Get-Acl -Path "c:\temp\1").Access | Select-Object IdentityReference, FileSystemRights, IsInherited | ft -AutoSize

Заранее спасибо за подсказку!!!

Добавлено:
TCPIP


Цитата:
Кстати, а кто какой средой пользуется для написания PoSH-скриптов?


Очень понравилась - PowerGUI Script Editor - из пакета PowerGui http://www.powergui.org/index.jspa
Автор: TCPIP
Дата сообщения: 09.06.2009 00:22
UserDmitry
Так а свойство InheritanceFlags не спасет?

Цитата:
$a = Get-Acl "c:\tmp\"
$aces =$a.access
$ace.InheritanceFlags

Вот дополнительная информация.

Спасибо, попробую. Я, в свое время, пробовал одну из первых версий PowerGUI - неплохая штучка, но кааак доооолго грузилась. Собственно ISE сейчас тоже медленно едет. Возможно, Aelita довела ее до совершенства. Кажется, Aelita сейчас в Quest делает PowerGUI (пара(?) человек из команды Дмитрия Сотникова). Возможно, я не прав.
Автор: UserDmitry
Дата сообщения: 09.06.2009 10:15
TCPIP


Цитата:
Так а свойство InheritanceFlags не спасет?


К сожалению нет.

Пробуем:

$a = Get-Acl -Path "c:\WINDOWS"
$aces = $a.access
$aces.InheritanceFlags

В ответ ничего.

Видимо потому, что $aces - это масив из групп/пользователей, которым были даны права на папку:

foreach ($x in $aces) {Write-Host $x.IdentityReference $x.InheritanceFlags}


Цитата:
CREATOR OWNER ContainerInherit, ObjectInherit
NT AUTHORITY\SYSTEM None
NT AUTHORITY\SYSTEM ContainerInherit, ObjectInherit
BUILTIN\Administrators None
BUILTIN\Administrators ContainerInherit, ObjectInherit
BUILTIN\Users ContainerInherit, ObjectInherit
BUILTIN\Users None
BUILTIN\Power Users ContainerInherit, ObjectInherit
BUILTIN\Power Users None


Или, например так:

$aces[0]


Цитата:
FileSystemRights : 268435456
AccessControlType : Allow
IdentityReference : CREATOR OWNER
IsInherited : False
InheritanceFlags : ContainerInherit, ObjectInherit
PropagationFlags : InheritOnly


А меня интересует, как проверить что установлена или нет галка о наследование на саму папку? Есть ли возможность увидеть это свойство через PowerShell?

---
Постоянно пользуюсь PowerGUI Script Editor из PowerGUI и каких-то проблемм со скоростью загрузки не замечаю.
Автор: Refugee
Дата сообщения: 09.06.2009 13:12
UserDmitry
$a.AreAccessRulesProtected
Автор: UserDmitry
Дата сообщения: 09.06.2009 13:48
Refugee

Cпасибо, очень помогли!

Свойство AreAccessRulesProtected - именно то что нужно (значение True говорит о том что "галка" напротив - Allow inheritable permissions... - не стоит).
Автор: TCPIP
Дата сообщения: 10.06.2009 01:16
UserDmitry
Хм. И в правду. Я пропустил весь кусок прохода по массиву. Из $aces понятное дело возвращается массив из ACE с флагами ContainerInherit (то есть, флаг, означающий, что данная запись списка контроля доступа будет наследоваться дочерними объектами).
Значение равное ContainerInherit и означало бы, что наследование кокретного ACE для папки включено. Поправьте пожалуйста, если вру. Но конечно, это ни к чему, ибо у каждой ACE свои флаги. Тем более, если есть AreAccessRulesProtected.

Цитата:
Свойство AreAccessRulesProtected - именно то что нужно

Хм, да. Про Get-Acl | Get-Member я и не подумал.
Автор: Refugee
Дата сообщения: 10.06.2009 01:27
ContainerInherit - это флажок у ACE, показывающий, что она будет наследоваться подпапкой, не имеющей AreAccessRulesProtected.

Цитата:
| Get-Member

проще МСДН посмотреть

Страницы: 123456789101112131415161718192021222324

Предыдущая тема: Не понятная проблема с видеокартой.


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.