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

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

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Открыть новую тему     Написать ответ в эту тему

tcg2



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

 
Обсуждаемые темы

    * Работа с SQL
    * Работа с Visual Studio
    * etc.

 
Помощь по использованию консоли pwsh, а также встроенной в Windows консоли powershell.exe  

Всего записей: 7 | Зарегистр. 20-11-2006 | Отправлено: 19:06 29-11-2006 | Исправлено: YuS 2, 18:04 02-06-2020
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serik1986
Завтра я сам смогу помочь, а пока вот полезная техника.
 
при любых непонятках тип объекта можно посмотреть так: $Group.GetType().Name    
(это если объект единственный; если же он массив типа Object[] то для того же результата надо прежде отшелушить от него любой элемент:  
$Groups[0].GetType().Name
)  

Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 15:43 15-03-2018 | Исправлено: LevT, 15:53 15-03-2018
serik1986



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

Всего записей: 267 | Зарегистр. 29-06-2009 | Отправлено: 15:50 15-03-2018
LevT



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

В самом пошике встроен отладчик, но он более гиковский, чем тот что привычен по VS, VBA и т.п
 
Если Вы пользуетесь ISE - то я бы рекомендовал модуль ISESteroids который превращает ISE в "Visual Powershell"
[PS]> Install-Module ISESteroids
[PSISE]> Start-Steroids
 
проблема в том, что использовать можно 10 дней, а затем захочет денег.
Решение я на руборде запрашивал и его делали, но по сути оно неоттестировано: мне проще менять как перчатки виртуалки с этим модулем
 
Ну и есть ещё VSCode - но у неё отдельная лёрнинг курва
Читал, что большая Visual Studio тоже умеет Powershell
 

Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 15:51 15-03-2018
serik1986



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

Всего записей: 267 | Зарегистр. 29-06-2009 | Отправлено: 16:00 15-03-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serik1986
 
Заметил вашу ошибку
 
Внутри блока PROCESS  
работа идёт с безымянной переменной $_ (она же $PSItem)
 
$_.sid
 
на входе командлета трубой залито ADGroup[] - вот они и будут перебираться, точно так же перебирался бы массив любого другого типа.

Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 16:01 15-03-2018 | Исправлено: LevT, 16:07 15-03-2018
serik1986



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
попытался сделать вливание первого аргумента как $_.sid, та же ошибка ...
вроде везде как и тут идет передача аргумента, на всякий случай опубликую все функции которые участвуют в проблемной цепочке...

Код:
function Get-Share {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
[Microsoft.ActiveDirectory.Management.ADGroup[]]
$Group
)
BEGIN {
    $Root = 'E:\Shares\'
}
PROCESS {
    $path = Join-Path $root $_.Name  
    $path  
}
}
 
function Update-Share {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline)]
[string]$Path,
[Microsoft.ActiveDirectory.Management.ADGroup[]]$Group
)
 
PROCESS {
    If ($false -eq (Test-Path $_)) {
        New-Item -Path $_ -Name $Group.Name -ItemType Directory  
    }
     
    $path | Update-SharePermissions -Group $Group    
}
 
}
 
function Update-SharePermissions{
[CmdletBinding()]
param(
    [Parameter(ValueFromPipeline)]
    [string]$Path,
    [Microsoft.ActiveDirectory.Management.ADGroup[]]$Group
)
 
PROCESS {
$acl = get-acl $Path
$isProtected = $true  
$preserveInheritance = $false
$acl.SetAccessRuleProtection($isProtected, $preserveInheritance)  
Set-Acl -Path $Path -AclObject $acl  
 
 
$Ar = New-Object system.security.accesscontrol.filesystemaccessrule($_.sid,"FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
$Acl.SetAccessRule($Ar)
Set-Acl -Path $Path -AclObject $Acl
}
 
}  
 
Get-Group -PipelineVariable Group |
Get-Share |  
    Update-Share -Group $Group

 

Всего записей: 267 | Зарегистр. 29-06-2009 | Отправлено: 16:17 15-03-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serik1986
 
Работа над ошибками.
 
1) Я перемудрил со стремлением избежать явных циклов
Работающая программа выглядит так  
 

Код:
 
Get-Group |  
    Foreach-Object {
          $_ |  
              Get-Share |  
                   Update-Share -Group $_
    }
 

 
2) Комментируя Вашу функцию навскидку без отладчика я невнимательно ознакомился с параметрами и их атрибутами - и оттого соврал:
в PROCESS перебираются залитые по трубе пути $path[]
 
А группа приходит не из трубы, а из обычного параметра (и скобки массива[] там в параметре кстати лишние - хотя и не поломают ничего)
Следовательно, в блоке PROCESS к группе надо обращаться по имени: $Group
 
 
 
2) Смотрим тип свойства sid у объекта типа ADGroup
 

Код:
 
[DBG]: PS C:\windows\system32>> ($Group.sid).GetType()
 
IsPublic IsSerial Name                                     BaseType                                                                                                                            
-------- -------- ----                                     --------                                                                                                                            
True     False    SecurityIdentifier                       System.Security.Principal.IdentityReference                                                                                        
 
 
[DBG]: PS C:\windows\system32>> ($Group.sid).GetType().name
SecurityIdentifier
 
[DBG]: PS C:\windows\system32>> $Group.sid | fl *
 
 
BinaryLength     : 28
AccountDomainSid : S-1-5-21-2052111302-651377827-682003330
Value            : S-1-5-21-2052111302-651377827-682003330-13103
 

 
 
Итак, символьный SID получается в Powershell так  
$Group.Sid.Value  
 
А в каком виде sid нужен дотнетовскому конструктору - смотрите сами  

Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 18:16 15-03-2018 | Исправлено: LevT, 13:52 16-03-2018
serik1986



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
спасибо большое, отладил немного код, провел работу над ошибками с командами, результатом стало создание папок с нужными правами... и после вторичного исполнения кода, даже если я права заменю вручную они обновляются на те которые должны быть.  
теперь не могу понять почему у меня в каждой папке с именем группы внутри лежит еще одна такая же папка...
Например E:/Shares/OfficeGroup_Acc/OfficeGroup_Acc
права при этом распространяются как на корневую OfficeGroup_*, так и на вложенную, но права соответствующие, т.к. дает понять что что-то происходит внутри шага цикла, но почему 2 папки не ясно...

Всего записей: 267 | Зарегистр. 29-06-2009 | Отправлено: 11:00 16-03-2018 | Исправлено: serik1986, 11:01 16-03-2018
LevT



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

Цитата:
спасибо большое, отладил немного код, провел работу над ошибками с командами, результатом стало создание папок с нужными правами... и после вторичного исполнения кода, даже если я права заменю вручную они обновляются на те которые должны быть.  

 
Такое поведение программы называется неприличным словом идемпотентность.
Надо к нему стремиться, и правильный Powershell в этом помогает.
 
 

Цитата:
теперь не могу понять почему у меня в каждой папке с именем группы внутри лежит еще одна такая же папка...  
Например E:/Shares/OfficeGroup_Acc/OfficeGroup_Acc  

 
Это в продакшене или ещё в тестовой шаре?
Можно попробовать новую тестовую шару: вдруг это артефакт после предыдущих запусков недоотлаженного скрипта - и больше он не появится?

Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 13:49 16-03-2018 | Исправлено: LevT, 13:50 16-03-2018
serik1986



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

Всего записей: 267 | Зарегистр. 29-06-2009 | Отправлено: 14:16 16-03-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serik1986
Под коврик можете кинуть скрипт в том виде, в котором тестируете?

Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 15:08 16-03-2018
serik1986



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

Всего записей: 267 | Зарегистр. 29-06-2009 | Отправлено: 15:59 16-03-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serik1986
 
Бага была здесь, вот так правильно:
 

Код:
 
function Update-Share {  
...  
PROCESS {  
    If ($false -eq (Test-Path $_)) {  
       New-Item $_ -ItemType Directory
    }  
       
    $path | Update-SharePermissions -Group $Group    
}  
   
}  
 

Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 16:43 16-03-2018 | Исправлено: LevT, 16:44 16-03-2018
Smitis



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

Цитата:
$false -eq (Test-Path $_)

Это, однако, сильно.
Странно, почему не ($true -ne (Test-Path $_)) было бы круче


----------
Разум когда-нибудь победит

Всего записей: 3217 | Зарегистр. 09-02-2003 | Отправлено: 17:50 16-03-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Smitis
чисто перестраховка по мотивам чего-то в давности читанного, объяснить сейчас не могу
Можно попробовать по-простому:
 
If (! (Test-Path $_))

Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 18:33 16-03-2018 | Исправлено: LevT, 18:57 16-03-2018
serik1986



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
да спасибо помогло...
теперь перехожу к следующему этапу марлезонского балета) работа с рабочими столами...
попробую отпишусь...

Всего записей: 267 | Зарегистр. 29-06-2009 | Отправлено: 10:10 17-03-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
serik1986
на файловом сервере включить ABE (Access Based Enumeration) не вариант?

Всего записей: 17167 | Зарегистр. 14-10-2001 | Отправлено: 10:21 17-03-2018
YuS_2



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

Цитата:
Странно, почему не ($true -ne (Test-Path $_)) было бы круче

Кстати, несмотря на не совсем корректную строку проверки условия, в powershell $true - всё, что -ne 0, а $false - только -eq 0, т.е.:

Код:
if($true -eq 2){echo True} else {"False"}
if($true -eq 10){echo True} else {"False"}
if($true -eq -15){echo True} else {"False"}
if($false -eq 0){echo True} else {"False"}

- здесь все выражения - истина.  
Такшта, в некоторых случаях, такое применение может оказаться оправдано.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 10:44 17-03-2018 | Исправлено: YuS_2, 10:47 17-03-2018
serik1986



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

Всего записей: 267 | Зарегистр. 29-06-2009 | Отправлено: 12:37 17-03-2018
Smitis



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

Цитата:
Такшта, в некоторых случаях, такое применение может оказаться оправдано.

Мне кажется, если результат выражения число, и 0 это ложь, а всё остальное - истина и это штатное поведение, то и сравнивать ни с чем не надо, тем более число сравнивать с логическим значением.


----------
Разум когда-нибудь победит

Всего записей: 3217 | Зарегистр. 09-02-2003 | Отправлено: 13:42 17-03-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Windows PowerShell 1.x/2.x/CTP


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru