Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam

Топ прошлой недели

  • Oskanov Oskanov 8 постов
  • alekseyJHL alekseyJHL 6 постов
  • XpyMy XpyMy 1 пост
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Новости Пикабу Помощь Кодекс Пикабу Реклама О компании
Команда Пикабу Награды Контакты О проекте Зал славы
Промокоды Скидки Работа Курсы Блоги
Купоны Biggeek Купоны AliExpress Купоны М.Видео Купоны YandexTravel Купоны Lamoda
Мобильное приложение

Powershell

С этим тегом используют

Windows Все
41 пост сначала свежее
9
DELETED
1 год назад
Лига программистов

Введение в pwsh для продвинутых. Часть I⁠⁠

Наибольшая мощь платформы .NET раскрывается посредством IL (intermediate language, эдакий символический аналог языка ассемблера) — во что, собственно, и преобразовывается код на C# или любом ином языке платформы. Однако IL сторонятся как огня даже бывалые .NET'овцы (звучит как-то неполиткорректно), что говорить о разработчиках сценариев PowerShell?! Между тем, для последних это не просто полезный навык, скорее — возможность взять планку на порядок выше покуда другие рвут и мечут в отсутствии какой-либо фичи. Именно так в бытность второй версии PowerShell и поступал автор, реализуя, к примеру, побитовы(й|е) сдвиг(и) в(лево|право) посредством функции, в основе которой был динамический метод.

Введение в pwsh для продвинутых. Часть I Powershell, Программирование, IT, Длиннопост

Здесь, правда, используется синтаксис pwsh, измождённым же ностальгией при переводе примера на вторую версию PowerShell следует быть аккуратными при использовании переменной $$ и принять на вид возможность имитации тернарной операции посредством массивов; для прочих пример может показаться притянутым за уши, так как pwsh уже располагает операторами -shl и -shr, а значит

(New-Shift).Invoke(7, 3)

или:

(New-Shift shr).Invoke(7, 1)

будут подобны разве что ложке дёгтя в бочке мёда. Однако, истинная причина, по которой мы сознательно избегаем синтаксиса версий ниже шестой, кроется в различного рода рестрикциях присущих .NET Framework (и, как следствие, "наследуемых" PowerShell -le v5), но отсутствующих в .NET Core, как, например, использование указателей в динамических методах. Чтобы продемонстрировать это, а заодно чуть подробнее разобрать сам принцип создания последних, рассмотрим побайтовый вывод числа через указатель.

Введение в pwsh для продвинутых. Часть I Powershell, Программирование, IT, Длиннопост

Результатом, как и ожидается будет 00 40 00 00. А теперь немой вопрос: для чего это может понадобиться, если всё можно написать на C# и скормить Add-Type? Прежде — скорость: динамические методы создаются в динамической (кто бы мог подумать!) сборке pwsh, в то время как Add-Type создаёт физическую сборку, подгружаемую в текущий домен приложений, а это, во-первых, требует валидации кода, во-вторых, ведёт к захламлению сборками домена в текущем сеансе. Вторая немаловажная причина кроется в обработке больших данных где исключается параллелизм, например, расчёт энтропии некоторого файла, с которой, как было замечено ранее здесь, лучше и начинать исследования бинарного кода.

Показать полностью 2
Powershell Программирование IT Длиннопост
4
24
DELETED
1 год назад
Информационная безопасность IT

Файл.URL не нужен!⁠⁠

То, что в список ассоциаций не заглядывают даже матёрые админы (большая часть из них) — это факт. Более того, разворачивая в Windows системах какой-либо из интерпретаторов, админы соглашаются с установщиком добавить ассоциации с соответствующими расширениями файлов, а после недоумённо пожимают плечами "как же нас таки поломали?", — в самом то деле?! Windows, чай, не UNIX где для исполнения какого-либо сценария нужно уметь чмодить (хотя в UNIX своих проблем безопасности с ворох газет), так что просто нужно взять на карандаш избегать ассоциаций, предпочитая им колхозные, но более безопасные средства запуска. Для наглядности (командная строка):

assoc .url | sed "s/.*=\(.*\)/ftype \1/" | cmd | sed "/=/!d"

Возвращает:
InternetShortcut="C:\WINDOWS\system32\rundll32.exe" "C:\WINDOWS\system32\ieframe.dll",OpenURL %l

С виду вроде обычная ассоциативная команда, если бы не одно но. Помимо стандартных протоколов в URL файле в качестве точки назначения может быть указан и локальный файл, причём это может быть как специально сформированный HTML, так и HTA или даже PE:
[InternetShortcut] URL=file:///C:\Windows\notepad.exe

Учитывая же, что некоторых разработчиков программ хлебом не корми, но дай понапихать упаковочной плёнки в виде тех же URL файлов в конечный дистрибутив, поднапрячь свои булки всё же стоит, если не взять под пристальный контроль ассоциации. Так что:
ftype InternetShortcut=

И\или:
assoc .url=

Это снизит риски, но не устранит проблемы полностью. Если вы подумали, что всё же можно будет вызвать URL файл из командной строки так:
rundll32 ieframe.dll,OpenURL <путь до URL файла>

можете запахнуть халат, ибо подобный эксгибиционизм отлавливается даже Windows Defender. Так почему же проблема не будет устранена полностью?

Файл.URL не нужен! Информационная безопасность, Powershell, Командная строка, Windows, Длиннопост

С одной стороны, ничто не помешает восстановить ассоциативные связи. С другой, можно вполне обойтись и без ассоциаций. ieframe.dll — это COM (явлющийся к тому же форвардом для shdocvw.dll, поэтому их интерфейсы аналогичны). Глянув содержимое ieframe.dll в OLEView, найдём весьма живописное полотно кисти анонимного танцовщика кода.

Файл.URL не нужен! Информационная безопасность, Powershell, Командная строка, Windows, Длиннопост

В чём прикол? Запускаем pwsh и пишем:

[Activator]::CreateInstance(
[Type]::GetTypeFromCLSID('C08AFD90-F2A1-11D1-8455-00A0C91F3880')
).Navigate('file:///C:\Windows\notepad.exe')

Такие коврижки. А ведь на месте Блокнота может оказаться удалённый зловред. В общем, делаем выводы.

Показать полностью 2
Информационная безопасность Powershell Командная строка Windows Длиннопост
5
2
rick1177
rick1177
2 года назад
Лига программистов

Вопрос по CMD и PowerShell⁠⁠

Ребят, прошу научения и разъяснений.

В общем, нашлёпнул такой скриптик:

@Echo off

powershell.exe -ExecutionPolicy Bypass -Command "Add-Type -AssemblyName Microsoft.VisualBasic;$confirmation = [Microsoft.VisualBasic.Interaction]::MsgBox('Вы уверены, что хотите выключить компьютер?', ([Microsoft.VisualBasic.MsgBoxStyle]::YesNo -bor [Microsoft.VisualBasic.MsgBoxStyle]::DefaultButton2), 'Выключение компьютера');if ($confirmation -eq 'Yes') {shutdown /s /t 0}"

pause

Работает, норм.

Для улучшения читаемости решил наставить переносов строк.

Довёл до такого состояния:

@echo off

powershell.exe -ExecutionPolicy Bypass -Command "

Add-Type -AssemblyName Microsoft.VisualBasic;

$confirmation = [Microsoft.VisualBasic.Interaction]::MsgBox(

'Вы уверены, что хотите выключить компьютер?',

([Microsoft.VisualBasic.MsgBoxStyle]::YesNo -bor [Microsoft.VisualBasic.MsgBoxStyle]::DefaultButton2),

'Выключение компьютера'

);

if ($confirmation -eq 'Yes')

{shutdown /s /t 0

}

"

pause

А он, вдруг, перестал выполняться.

Хотя, как я понял, не имеют значения переносы строк... но вот не выполняется.

В блокнотике это выглядит так:

Вопрос по CMD и PowerShell Вопрос, Powershell, Cmd, Скрипт, Программирование

Вопрос. Как правильно работать с переносами строк и отступами, чтобы корректно работало.

P.S. Скрипт предназначен для выключения винды так, чтобы формировалось "засыпание", поскольку оно мешает корректному монтированию разделов на параллельно стоящем Ubuntu.

Показать полностью 1
[моё] Вопрос Powershell Cmd Скрипт Программирование
14
spanjokus
2 года назад

Как я проучил токсичную тетку на работе⁠⁠

Наверняка вы знаете, что в Windows есть скрытые папки файлы, которые при желании можно посмотреть. Повздорил я тут с одной мадам на работе и решил ее слегка проучить, удаленно через PowerShell скрыв ее важные папки через данный функционал, оху было, что она все потеряла)))))))))))) но админчик потом минут через 30 допер, что она их не удалила, а скрыла, не знаю что он про нее подумал.

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

[моё] Powershell Месть Текст Windows
7
107
vlad196
vlad196
2 года назад
Компьютер это просто

Диспетчер пакетов на Windows⁠⁠

Открыть PowerShell от имени Администратора > прописать winget upgrade --all

Это всё что нужно было мне сделать ради моего удовлетворения!


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

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

Что самое интересное Winget сам подхватывает программы и ищет к ним обновления, т.е. абсолютно ничего не нужно делать для его работы.

Т.е. ещё раз. Если много программ, то часто случается так, что программы, которые давно не открывались требуют обновлений, а иногда и перехода на сайт и повторного скачивания.

Благодаря Winget всего этого можно миновать, просто обновляя всё в одном месте


Единственное, поддержка для Windows 10 1709 (сборка 16299) или более поздней версии. И для Windows 10 его нужно качать отдельно.

Всё написано в документации: https://learn.microsoft.com/ru-ru/windows/package-manager/

Там же и описаны другие команды, присущие пакетным диспетчерам:

https://learn.microsoft.com/ru-ru/windows/package-manager/wi...


Единственное, приведу вариант установки новых пакетов для новичков.

1) Заходим на сайт https://winget.run/

2) Ищем там интересующий пакет

Диспетчер пакетов на Windows Linux, Windows, Компьютерная помощь, Компьютер, Powershell, Длиннопост

3) Копируем команду

4) Вставляем её в Powershell и выполняем

Диспетчер пакетов на Windows Linux, Windows, Компьютерная помощь, Компьютер, Powershell, Длиннопост

И вот! через winget Мы только что установили Steam


P.S. Инструмент, как я погляжу довольно давно существует, но я увидел только сейчас и меня поразило, что такая штука теперь есть и на Windows.

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

Показать полностью 2
Linux Windows Компьютерная помощь Компьютер Powershell Длиннопост
79
22
risare
risare
2 года назад
Программы и Браузеры

Возвращаем уведомления приложению на Windows 10/11, которого нет в списке «Уведомления»⁠⁠

Всем привет!

Недавно столкнулся с данной ситуацией, надеюсь, кому-то её решение поможет.


Итак, однажды ты запрещаешь уведомления приложению через панель уведомлений, вот так:


Windows 10:

Возвращаем уведомления приложению на Windows 10/11, которого нет в списке «Уведомления» Powershell, Windows 10, Windows 11, Уведомление, Push-уведомления, Длиннопост

Windows 11:

Возвращаем уведомления приложению на Windows 10/11, которого нет в списке «Уведомления» Powershell, Windows 10, Windows 11, Уведомление, Push-уведомления, Длиннопост

А потом обнаруживаешь, что обратно включить их уже не можешь, потому что приложение отсутствует в списке Параметры > Система > Уведомления и действия на Windows 10 (Параметры > Система > Уведомления на Windows 11)! В списке (классических) приложений нашего приложения почему-то нет.


Пример списка приложений на Windows 11:

Возвращаем уведомления приложению на Windows 10/11, которого нет в списке «Уведомления» Powershell, Windows 10, Windows 11, Уведомление, Push-уведомления, Длиннопост

И дело не в г-сборке и не в вирусах/антивирусах. Проблема повторяется и на полностью оригинальных ОС, только что установленных. Помогает создание нового пользователя — для него уведомления приложения работают. Но если запретить уведомления и у нового пользователя, история повторится. Это не выход.

Решение

В Интернете на форуме OSZONE подсказали, что управление уведомлениями для текущего пользователя осуществляется в двух местах одновременно, а именно:


1) через раздел реестра для текущего пользователя:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Notifications\Settings\имя_или_псевдоним_приложения

Имя приложения в реестре (выше) пригодится позднее для правки исправляющего сценария.


2) в SQLite-базе данных у текущего пользователя:

%LOCALAPPDATA%\Microsoft\Windows\Notifications\wpndatabase.db

Добрые люди написали Powershell-сценарий для возвращения уведомлений в реестр и в базу. Приведу здесь свою адаптированную версию сценария. Вам нужно будет лишь запустить батник рядом со сценарием, остальное сценарий сделает сам.


Учтите, что для сценария потребуется подключение к Интернету (автоматом скачивается модуль для работы с SQLite-базой).


Вот сценарий powershell. Копируем текст сценария, вставляем в текстовый редактор, сохраняем в кодировке UTF-8 с расширением .ps1 (назвать можно как угодно, главное, такое же имя пропишите в батнике) или качаем готовый — не забываем отредактировать! Помещаем рядом с батником.


Батник для запуска сценария (возможно, понадобится запускать от имени администратора, поскольку меняется системное разрешение работы со сценариями). Готовый батник тут, тоже нужно будет отредактировать (вписать имя файла сценария).

По окончании работы сценария уведомления начнут работать сразу, перезагрузки и выхода из системы не потребуется!


Удачи! :)

Показать полностью 2
[моё] Powershell Windows 10 Windows 11 Уведомление Push-уведомления Длиннопост
12
12
Car1son
2 года назад
Лига Сисадминов

Powershell Windows Server 2019⁠⁠

Всем привет! Столкнулся с проблемой, есть скрипт на powershell, который запускает синхронизацию пользователей ad c Google. Сам скрипт брался из доков гугла. Когда запускаешь вручную, все отрабатывает, через планировщик пишет что отработал, но результата нет. Делал без помощи ps, напрямую через приложение GCDS также отрабатывает, но нет результата. Пользователь от которого задача добавлен в Logon as a batch job. Задача отрабатывает, если запускать когда пользовательзалогинен - отрабатывает, когда ставишь галочку независимо залогинен или нет, не отрабатывает. Запуск скрипта на контроллере домена. Возможно что то не сделал/разрешил?


UPD:  Сам скрипт взят отсюда: https://cloud.google.com/architecture/identity/federating-gc...

В планировщике помимо скрипта используются аргументы.

К примеру вот такая строка выполняется в PS: powershell.exe -ExecutionPolicy Bypass -file C:\ProgramData\gcds\sync.ps1 -config C:\ProgramData\gcds\config.xml -gcdsInstallationDir 'C:\Program Files\Google Cloud Directory Sync'

и такая строка также выполняется

powershell -command "& {C:\ProgramData\gcds\sync.ps1 -config C:\ProgramData\gcds\config.xml -gcdsInstallationDir 'C:\Program Files\Google Cloud Directory Sync'}"

Но если засунуть все в планировщик и выбрать опцию Run whether user is logged on or not не выполняется (хотя учетной записи дано право на вход в качестве пакетного задания).

Windows server Powershell Текст
29
3
SFalkorr
SFalkorr
2 года назад
Лига программистов

Помогите с пошем⁠⁠

Затупил на банальной задаче - отсечь повторяющиеся значения. Понимаю, что это крайне просто, но с утра плохо соображаю. Простая функция копирования, нужно впендюрить счетчик в процентах выполнения от 0 до 100. Посчитал процент выполнения, но как в условие впихнуть сравнение, что если $percent2 отличается от $percent1,  то выводить изменение только один раз. Сейчас на выходе, по мере копирования  получаем ...87 87 87 87 87 87 87 88 88 88 88 88 88 88 88 88 89 89 89 89 89... а надо поймать условие только при смене 1 на 2 , потом на 3 ну и так далее.


Короче тупо отсечь повторяющиеся значения переменной в цикле.


function Copy-File

{

param ([string]$from,

[string]$to)

$ffile = [io.file]::OpenRead($from)

$tofile = [io.file]::OpenWrite($to)

$in = Get-item $from

$in_Length = $in.Length

try

{

$sw = [System.Diagnostics.Stopwatch]::StartNew();

[byte[]]$buff = new-object byte[] (4096 * 1024)

[long]$total = [long]$count = 0

do

{

$percent1 = (($total / $in_Length).ToString("P")).Trim('%') -replace ',','.'

$count = $ffile.Read($buff, 0, $buff.Length)

$tofile.Write($buff, 0, $count)

$total += $count

$percent2 = (($total / $in_Length).ToString("P")).Trim('%') -replace ',','.'

[math]::Round($percent2,0)

###########################


# выводить результат только если переменная изменилась один раз


###########################

}

while ($count -gt 0)

$sw.Stop();

$sw.Reset();

}

finally

{

$ffile.Close();

$tofile.Close();

}

}

Copy-File -from 'D:\Films2\The.Island.2005.US.BDRemux.1080p.mkv' -to 'g:\The.Island.2005.US.BDRemux.1080p.mkv'

Показать полностью
Помощь Код Powershell Текст
8
Посты не найдены
О Нас
О Пикабу
Контакты
Реклама
Сообщить об ошибке
Сообщить о нарушении законодательства
Отзывы и предложения
Новости Пикабу
RSS
Информация
Помощь
Кодекс Пикабу
Награды
Команда Пикабу
Бан-лист
Конфиденциальность
Правила соцсети
О рекомендациях
Наши проекты
Блоги
Работа
Промокоды
Игры
Скидки
Курсы
Зал славы
Mobile
Мобильное приложение
Партнёры
Промокоды Biggeek
Промокоды Маркет Деливери
Промокоды Яндекс Путешествия
Промокоды М.Видео
Промокоды в Ленте Онлайн
Промокоды Тефаль
Промокоды Сбермаркет
Промокоды Спортмастер
Постила
Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии