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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
Почему бы не вывести всем юзерам ЕДИНСТВЕННЫЙ НА ВСЕХ ярлык?
не прямо на папки, а на одну и ту же шару (заглянув в которую они увидят только те папки, которые  им разрешено видеть)
 
Вы уверены что вам так уж надо что-то ещё улучшать?

Всего записей: 17163 | Зарегистр. 14-10-2001 | Отправлено: 17:01 17-03-2018
2as

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

Цитата:
serik1986
на файловом сервере включить ABE (Access Based Enumeration) не вариант?

ага, и не стоит биться лбом от повершелл

Цитата:
Почему бы не вывести всем юзерам ЕДИНСТВЕННЫЙ НА ВСЕХ ярлык?
не прямо на папки, а на одну и ту же шару (заглянув в которую они увидят только те папки, которые  им разрешено видеть)

А если очень хочется работать именно с ярлыками - то в общедоступную шару можно положить файлы .lnk (ярлыки на ресурсы)  
назначая/удаляя каждому ярлыку права делаем их видимыми/невидимыми определенным пользователям/группам.
... и без всяких танцев с бубном ...
 

Всего записей: 3506 | Зарегистр. 09-09-2003 | Отправлено: 18:48 17-03-2018 | Исправлено: 2as, 18:49 17-03-2018
YuS_2



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

Цитата:
то и сравнивать ни с чем не надо, тем более число сравнивать с логическим значением.

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

Код:
$true+5

- вполне себе правильное выражение, да и вообще:

Код:
[int]$true
[bool]$true

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

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 19:01 17-03-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Smitis
 
Если уж на то пошло, то вот полный список в движении  
https://github.com/nightroman/PowerShellTraps
 
(каждый прибабах можно запустить и лично пощупать)

Всего записей: 17163 | Зарегистр. 14-10-2001 | Отправлено: 19:12 17-03-2018
Smitis



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

Цитата:
Кстати, вот тут есть наглядное описание булевых значений в powershell

Кстати, хороший пример, как неявное преобразование типов приводит к трудноопределимой ошибке. Вот если бы test TRUE и test FALSE сразу бы орали на несоответствие типов, было бы проще (точнее, не сама функция test, что реализуемо через параметры, а оператор if)


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

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



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
LevT
Очень хотелось бы услышать Ваш ответ, на вопрос по powershell , заданный в этой теме.
 

Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 20:45 17-03-2018 | Исправлено: NIKZZZZ, 20:48 17-03-2018
YuS_2



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

Цитата:
неявное преобразование типов приводит к трудноопределимой ошибке.

Не совсем понял, где ошибка? Ведь то, что там описано, задумано разработчиками... и описывает один из них...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 21:40 17-03-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
NIKZZZZ
Вы вообще в курсе, что в интернетах вам никто ничего не должен?  
Я обещал сделать, но не обещал до тех пор молчать в соседних темах, ради Вашего уудовольствия.

Всего записей: 17163 | Зарегистр. 14-10-2001 | Отправлено: 22:58 17-03-2018
serik1986



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

Цитата:
Почему бы не вывести всем юзерам ЕДИНСТВЕННЫЙ НА ВСЕХ ярлык?
не прямо на папки, а на одну и ту же шару (заглянув в которую они увидят только те папки, которые  им разрешено видеть)  

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

Всего записей: 267 | Зарегистр. 29-06-2009 | Отправлено: 08:26 19-03-2018
deminart



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем добрый день! Подскажите пожалуйста, в чём может быть проблема?...
 
Ситуация следующая, нужно что бы скрипт запускался в скрытом режиме с административными привилегиями. Есть простой скрипт, который запускает bat от имени администратора:  
 
CreateObject("Shell.Application").ShellExecute "\\192.168.1.1\NETLOGON\testpo.BAT", "", "", "runas", 0
 
На Windows 10 он отрабатывается не полностью, в батнике много всего прописано, но первым делом он должен подключать сетевые диски:
 
пр:
 
net use n: /DELETE /y
net use b: \\file_dump\Pump
 
net use v: /DELETE /y
net use x: \\file_dump\Dump  
 
и далее по списку...
 
Но он этого не делает. Если вначале прописать, например, md C:\TEST, то пожалуйста, но на этом всё, далее тишина...
 
Попробовал вывести лог cscript.exe "C:\testpo.vbs" 2>"C:\my.log" пусто...
 
Сам батник рабочий, на данный момент запускается через скрипт:
 
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "\\192.168.1.1\NETLOGON\testpo.bat" & Chr(34), 0
Set WshShell = Nothing
 
На XP скрипт вообще не отрабатывается, ничего не пишет, ошибок никаких нет, в остальном всё тоже самое, напрямую и через скрипт написанный выше всё работает.
 
Пробовал сохранять скрипт в разных кодировках (была похожая проблемка...) (сейчас в UTF-8 без BOM, windows 1251). Пробовал по разному запускать, в cmd от имени администратора и тп. При запуске ни на что не ругается, на 10-ке только появляется запрос UAC, который тоже впоследствии отключался.
 
На Win 7 скрипт прекрасно себя чувствует! Какая-то проблема с кодировками или же с правами\именами администратора?...Тестируемые ПК в домене, на OracleVM, запускается всё из под учётки с административными привилегиями.

Всего записей: 59 | Зарегистр. 02-06-2017 | Отправлено: 13:29 21-03-2018 | Исправлено: deminart, 14:23 21-03-2018
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
deminart
Powershell, конечно, вещь универсальная и со скриптами wsh справляется, но вопросы у Вас явно не для данной ветки...
Заодно, раз уж запостили, попробуйте поточнее сформулировать вопрос и опишите, что в итоге требуется получить. Только не описание кода делайте, который не работает, а именно задачу опишите.
Т.е. задачу ведь можно и powershell-ом решать...

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



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

Цитата:
но вопросы у Вас явно не для данной ветки.

 
Да, маленько промахнулся веткой
 
Спасибо, но Powershell не подойдёт, нужен vbs\bat...
 

Цитата:
Только не описание кода делайте, который не работает

 
Он работает, только не везде и не полностью))
 
 

Цитата:
задачу опишите

 
Собственно задача довольно проста: Что бы у пользователей при входе в систему отрабатывался батник от имени администратора. Есть варианты, но они не подходят по ряду причин, либо безопасность хромает либо удобство.

Всего записей: 59 | Зарегистр. 02-06-2017 | Отправлено: 18:14 21-03-2018 | Исправлено: deminart, 08:07 22-03-2018
YuS_2



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

Цитата:
Спасибо, но Powershell не подойдёт, нужен vbs\bat...

Ну, тогда надо переадресовать вопрос в соответствующую ветку.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 21:34 21-03-2018
Stvens



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Прошу прощения у тех кто в теме, я ВООБЩЕ ничего не понимаю в программировании
 
Вот скрипт, для смещения временного кода в Субтитрах формат (srt), что не очень важно

Код:
function moveit
{
    [CmdletBinding(DefaultParameterSetName="Increase")]
 
    Param(
    [parameter(Mandatory=$true)]
    [string]
    $path_original,
 
    [parameter(Mandatory=$true)]
    [string]
    $path_result,
 
    [int]
    $minutes = 0,
 
    [ValidateRange(0,59)]
    [int]
    $seconds = 0,
 
    [parameter(Mandatory=$false, ParameterSetName="Increase")]
    [switch]
    $Increase = $true,
 
    [parameter(Mandatory=$true, ParameterSetName="Decrease")]
    [switch]
    $Decrease
    )
 
    if($Decrease) {$Increase = $false}
 
    $PSCmdlet.ParameterSetName
 
    $offset = New-TimeSpan -Minutes $minutes -Seconds $seconds
 
    $content = Get-Content $path_original
    #[datetime]$refstart = 0
    #[datetime]$refend = 0
 
    Set-Content -Value $null -Path $path_result
 
    foreach($line in $content)
    {
        if($line -match '(?\d\d:\d\d:\d\d,\d\d\d) --> (?\d\d:\d\d:\d\d,\d\d\d)')
        {
            $refstart = [datetime]::Parse($($matches.start -replace ',','.'))
            $refend = [datetime]::Parse($($matches.end -replace ',','.'))
 
            if($Increase)
            {
                $offstart = $refstart+$offset
                $offend = $refend+$offset
            }
            else
            {
                if($refstart.TimeOfDay -lt $offset)
                {
                    $offstart = [datetime]0
                }
                else
                {
                    $offstart = $refstart-$offset
                }
 
                if($refend.TimeOfDay -lt $offset)
                {
                    $offend = [datetime]0
                }
                else
                {
                    $offend = $refend-$offset
                }
            }
 
            Add-Content -Value $("{0:HH:mm:ss,fff} --> {1:HH:mm:ss,fff}" -f $offstart,$offend) -Path $path_result
        }
 
        else
        {
            Add-Content -Value $line -Path $path_result
        }
    }
}

 
Вот что пишет автор:
Субтитры — замечательная вещь, особенно когда не удается с первых десяти попыток разобрать что же сказал персонаж фильма или сериала сквозь грохот взрывов и скрежет рушащихся зданий. Однако случается так, что субтитры (в частности, те, что находятся в отдельном файле) не совпадают с видеорядом. Если отставание (или наоборот) составляет несколько секунд, то в этом нет ничего ужасного. В большинстве плееров это выправляется нажатием нескольких кнопок. Однако когда отставание составляет уже минуты и для того, чтобы нагнать видеоряд приходится совершить пару сотен нажатий — это несколько другое дело.
 
Здесь может помочь следующий скрипт.
 
В нем используются такие вещи как регулярные выражения, функция -f для форматирования данных нужным нам образом, а также статическая функция [datetime]::Parse(). Можно довольно долго рассказывать о каждой из них по-отдельности, поэтому я не буду вдаваться в детали в этом посте, а просто выложу скрипт, а точнее функцию.
 
Для ее использования нужно указать путь к исходному файлу (параметр path_original), путь к результирующему файлу (path_result), временной промежуток, на который нужно сдвинуть (параметры minutes и seconds), а также в каком направлении нужно сдвинуть субтитры — в сторону увеличения временных меток (Increase — значение по-умолчанию, поэтому явно параметр указывать не обязательно) или в сторону их уменьшения (Decrease).
 
Вопрос простейший, куда именно надо вписать пути и как ТОЧНО какие символ надо вставить:
Путь оригинала для примера:
J:\!!!4K Vedeo!!!\01.srt
Путь выходного для примера:
J:\!!!4K Vedeo!!!\02.srt
 
Сдвиг по времени, 1 минута, 20 секунд
 
Сдвиг не интересен он всегда будет вперед но если напишите как вставить назад будет не плохо.
 
Просто на примере скрипта этого вставьте мои параметры так чтобы РАБОТАЛО.
Пожалста!

Всего записей: 703 | Зарегистр. 11-02-2003 | Отправлено: 13:59 31-03-2018
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Stvens
Не готов всё объяснять с азов и все варианты вызова функции, но один вариант вот:
видео - https://www.upload.ee/files/8276050/Windows_10_Pro_x64.webm.html

Всего записей: 3521 | Зарегистр. 16-08-2012 | Отправлено: 15:06 01-04-2018
Stvens



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

Цитата:
Не готов всё объяснять с азов и все варианты вызова функции, но один вариант вот:  
видео - https://www.upload.ee/files/8276050/Windows_10_Pro_x64.webm.html

Спасибо большое.
Мне то же самое подсказали, только уточнили что это надо в конце прописать скрипта.
 
Иначе говоря для сдвига времени вперед в субтитрах надо написать такой скрипт:
 

Код:
function moveit
{
    [CmdletBinding(DefaultParameterSetName="Increase")]
 
    Param(
    [parameter(Mandatory=$true)]
    [string]
    $path_original,
 
    [parameter(Mandatory=$true)]
    [string]
    $path_result,
 
    [int]
    $minutes = 0,
 
    [ValidateRange(0,59)]
    [int]
    $seconds = 0,
 
    [parameter(Mandatory=$false, ParameterSetName="Increase")]
    [switch]
    $Increase = $true,
 
    [parameter(Mandatory=$true, ParameterSetName="Decrease")]
    [switch]
    $Decrease
    )
 
    if($Decrease) {$Increase = $false}
 
    $PSCmdlet.ParameterSetName
 
    $offset = New-TimeSpan -Minutes $minutes -Seconds $seconds
 
    $content = Get-Content $path_original
    #[datetime]$refstart = 0
    #[datetime]$refend = 0
 
    Set-Content -Value $null -Path $path_result
 
    foreach($line in $content)
    {
        if($line -match '(\d\d:\d\d:\d\d,\d\d\d) --> (\d\d:\d\d:\d\d,\d\d\d)')
        {
            $refstart = [datetime]::Parse($($matches[1] -replace ',','.'))
            $refend = [datetime]::Parse($($matches[2] -replace ',','.'))
 
            if($Increase)
            {
                $offstart = $refstart+$offset
                $offend = $refend+$offset
            }
            else
            {
                if($refstart.TimeOfDay -lt $offset)
                {
                    $offstart = [datetime]0
                }
                else
                {
                    $offstart = $refstart-$offset
                }
 
                if($refend.TimeOfDay -lt $offset)
                {
                    $offend = [datetime]0
                }
                else
                {
                    $offend = $refend-$offset
                }
            }
 
            Add-Content -Value $("{0:HH:mm:ss,fff} --> {1:HH:mm:ss,fff}" -f $offstart,$offend) -Path $path_result
        }
 
        else
        {
            Add-Content -Value $line -Path $path_result
        }
    }
             
}
moveit -path_original 'J:\01.srt' -path_result 'J:\02.srt' -minutes 0 -seconds 20

 
Для сдвига времени назад в субтитрах последнюю строку надо изменить так:
 
moveit -path_original 'J:\01.srt' -path_result 'J:\02.srt' -minutes 0 -seconds 20 -Decrease

Всего записей: 703 | Зарегистр. 11-02-2003 | Отправлено: 19:07 01-04-2018 | Исправлено: Stvens, 19:12 01-04-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Test-Driven Development
перевод главки отсюда
 
This is an in-progress chapter. Here’s what we have left to do: Jeff hasn’t completed his
pass We haven’t done our final copyedit and tech edit
Эта глава ещё пишется. Вот что нам ещё осталось сделать: Джефф не сказал свое слово, и мы не сделали финальную вычитку.
 
Test-Driven Development, или TDD – большая философия. Test Driven Development by Example, by Ken Beck один из лучших текстов на эту тему, если захотите копнуть глубже… потому что мы сейчас глубже не полезем.
В сухом остатке, TDD это всего лишь практика написания юнит тестов раньше написания самого кода. Ваши юнит тесты служат, таким образом, как бы подробной функциональной спецификацией для вашего кода. Если бы кто-то другой написал за вас код, было бы достаточно убедиться, что тот проходит все ваши тесты, и вы с ним согласились бы насчет того, что код хорош.  
 
Это не значит сидеть и писать все возможные тесты, которые могут вам потенциально понадобиться. На практике это означает, что TDD это часть итеративного процесса написания кода (за исключением самых простых однострочников).
Допустим, к примеру, что вы обычно начинаете писать функцию с определения её параметров. Самое обычное дело. С TDD вы бы начали с написания тестов, которые проверяют и валидируют те параметры, прежде единой буквы реального кода. Вы бы писали тесты, которые проверяют работу трубы там, где та предполагается, а также тот факт, что принимаются все те наборы параметров, которые предполагаются, и т.п.  
После того, как тесты готовы – вы б начинали писать ваш код с параметров (как вы обычно и делаете, если следуете нашим рекомендациям). Вы б продолжали возиться с блоком Param до тех пор, пока все тесты не станут зелёными.
Затем вы бы двинулись дальше, например, у вас есть параметр-переключатель, изменяющий поведение функции. Вы бы написали тесты, которые тестируют разные вариенты поведения, и только потом реализацию этой логики, и потом запустили свои тесты. И продолжали бы править свой код до тех пор, пока все тесты не позеленеют.
 
Идея TDD  - заставить вас думать о том, каким требованиям ваш код должен соответствовать прежде, чем вы рванётесь реально просиживать задницу в IDE.  Первоочередное написание тестов предполагает определённую фазу дизайна, когда вы думаете о вещах прежде, чем начинаете печатать.  TDD как бы заставляет вас делать то, что вы и так считаете полезным, но не всегда хотите делаеть.
Допустим, вы закончили писать функцию (и её тесты!). Впоследствии обнаруживается баг. Прежде чем фиксить этот баг, вы пишете тест(ы) для обнаружения этого бага. Вначале этот тест провалится. Но потом вы начинаете фиксить ваш код до тех пор, пока все тесты не позеленеют вновь.  С TDD всегда сначала пишется тест, а лишь затем код, проходящий этот тест.
 
Это большой гимор. Поверьте, ещё не каждая команда профессионалов поступает так. Но те, кто это делают, весьма успешны благодаря этой методологии, пишут более полные и надежные наборы тестов-костыли(fixtures), способные поддержать сложные общие/групповые цели, которыми определяется желаемое поведение кода.

Всего записей: 17163 | Зарегистр. 14-10-2001 | Отправлено: 10:17 01-05-2018 | Исправлено: LevT, 15:19 01-05-2018
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
После обновления windows на 1803, сломался intellisense в powershell ISE, нажимая ctrl+space — падает.
Как лечить?


ЗЫ и у них: https://social.technet.microsoft.com/Forums/en-US/f0b5b825-28e0-4b09-a9e6-4a0b8ac50e5e/intellisense-not-working-for-powershell-ise
ЗЫ2. После May 23, 2018—KB4100403 (OS Build 17134.81) у меня заработало.

Всего записей: 3521 | Зарегистр. 16-08-2012 | Отправлено: 17:59 23-05-2018 | Исправлено: iNNOKENTIY21, 14:34 25-05-2018
Metall Doktor



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
День добрый .
Я в PS вообще не бум-бум , есть какие-то базово обрывочные знания.
Задача в общем предельно простая.
Если список с именем и фамилией пользователя.
Мне нужно проверить если среди них в АД отключенные.
 
Get-aduser на прямую ищет только по логину , для поиска по другим атрибутам нужен -filter , на сколько я понял из интернета и собственных опытов.
 Для работы с файлом я нашёл вот такой пример
 
 
Import-Csv c:\ps\usernsme_list.csv | ForEach {
Get-ADUser -identity $_.user -Properties Name, telephoneNumber |
Select Name, telephoneNumber |
Export-CSV c:\ps\export_ad_list.csv -Append -Encoding UTF8
}
 
В общем меня все устраивает - только тут идёт поиск по иимени.
А как в фильтре сослаться на файл?

Всего записей: 323 | Зарегистр. 22-09-2016 | Отправлено: 16:26 18-07-2018
LevT



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Metall Doktor
Приходится принимать во внимание тот случай, если встретятся два юзера с одинаковыми инициалами: потому и существуют Identity
А ФИО в AD конечно есть, но компоненты могут встречаться в разных полях по причинам историческим, например знаю контору где они прописаны в свойстве CN
 
Так что вам на месте сперва надо построить таблицу соотвествия ФИ -> samAccountName и либо заранее убедиться, что в ней нет повторяющихся строк,  
либо искать по этому идентификатору - и он укажет на проблемного юзера точно
Извините, но я это оставлю в качестве упражнения и напишу лишь то, о чем просили:
 
Import-Csv c:\ps\usernsme_list.csv -Header 'CN' |  
        Get-AdUser -Properties CN,Enabled -Filter {CN -eq $_.CN} |      #В фильтре надо ссылаться на конкретную строчку файла
                Where-Object {$_.Enabled -eq $false} |
                        Select-Object -Property CN,samAccoutName
 

Всего записей: 17163 | Зарегистр. 14-10-2001 | Отправлено: 09:31 19-07-2018 | Исправлено: LevT, 11:53 19-07-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