Задать вопрос
Ответы пользователя по тегу PowerShell
  • Почему скрипт запуска виртуальной машины перестал работать?

    @rPman
    какое красивое садамаза, скрипт запускает сам себя на javascript являясь bat, да еще и внутри powershell, как это читать и отлаживать, известно только его разработчику :)

    И самое главное, вам точно нужно GUI для смены даты? И уж точно для этого не требуется ни powershell ни повышение прав доступа (хотя может у вас там так настроено)

    У virtualbox есть соответствующие команды VBoxManage, которые можно было просто прописать в текстовом файлике, назвать blablabla.bat и запускать
    upd. нужно считать разницу в миллисекундах между текущим временим и целевым, на bat это сложно, поэтому лучше сразу писать на чем то типа javascript, не изобретая паровоза (и от туда же запускать vboxmanage)

    p.s. кайфую с современного ИИ, который это сумел разобрать и по полочкам разложить этот кошмар
    anthropic:claude sonnet 3.5
    ...
    проанализируй этот скрипт для windows, почему тут сместь cmd и javascript, и начни описание, что именно делают первые строчки
    Давайте разберем этот интересный гибридный скрипт:

    Первые строки скрипта представляют собой "полиглот" - код, который может быть интерпретирован несколькими языками программирования:

    ```
    set @x=0; /*
    @echo off
    ver |>NUL find /v "5." && if "%~1"=="" cscript.exe //nologo //e:jscript "%~f0"& exit /b
    ```

    Это хитрая конструкция, которая:
    1. Начинается как cmd-скрипт (`@set @x=0;`)
    2. Открывает многострочный комментарий в JavaScript (`/*`)
    3. Выключает вывод команд в cmd (`@echo off`)
    4. Проверяет версию Windows и если скрипт запущен без параметров, перезапускает сам себя через cscript.exe в режиме JavaScript

    Последняя строка скрипта:
    ```javascript
    */new ActiveXObject('Shell.Application').ShellExecute (WScript.ScriptFullName,'Admin','','runas',1);
    ```
    закрывает JavaScript-комментарий и содержит код для повышения привилегий - перезапуска скрипта с правами администратора.

    Это техника самоповышения привилегий (UAC bypass), которая позволяет скрипту перезапустить себя с правами администратора, если он был запущен от обычного пользователя.

    Основная часть скрипта написана на PowerShell и использует Windows Forms для создания графического интерфейса. Согласно документации [learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/api/syste...), скрипт создает форму для ввода даты, которая будет использоваться для настройки BIOS времени виртуальной машины VirtualBox.

    Такая сложная структура используется для:
    1. Обеспечения запуска с правами администратора
    2. Совместимости с разными версиями Windows
    3. Комбинирования возможностей разных языков скриптования Windows

    продолжай дальше анализ, почему там еще и powershell?
    PowerShell используется в этом скрипте для основной функциональности, и его часть начинается после строк:

    ```
    ;@echo off
    ;@Findstr -bv ;@ "%~f0" | powershell -noprofile -command - & goto:eof
    ```

    Эта конструкция особенно интересна, потому что:
    1. Использует Findstr для фильтрации содержимого файла, пропуская строки, начинающиеся с `;@`
    2. Передает отфильтрованное содержимое в PowerShell через пайп (`|`)
    3. Запускает PowerShell без профиля (`-noprofile`) для ускорения загрузки

    PowerShell был выбран для основной части скрипта по нескольким причинам:

    1. **Объектная модель**: Как отмечается в [thenewandshiny.com](https://thenewandshiny.com/powershell-everywhere/), PowerShell работает с объектами, а не с текстом, что делает его более надежным для работы с системными компонентами.

    2. **Удобство работы с GUI**: PowerShell позволяет легко создавать Windows Forms для пользовательского интерфейса, что используется в функции `CustomInputBox`

    3. **Управление VirtualBox**: PowerShell предоставляет удобные средства для запуска процессов и управления VirtualBox через `VBoxManage`

    4. **Работа с датами**: PowerShell имеет мощные средства для работы с датами и временем, что критично для этого скрипта

    Важно отметить, что в скрипте используется разделение на Windows PowerShell и PowerShell Core. Как упоминается в [get-powershellblog.blogspot.com](https://get-powershellblog.blogspot.com/2017/10/wh...), это важно учитывать при работе с разными версиями PowerShell.

    Скрипт использует стандартный формат командлетов PowerShell `Verb-Noun`, хотя, как отмечается в [scoop-docs.vercel.app](https://scoop-docs.vercel.app/docs/misc/Why-PowerS...), такой формат может казаться излишне многословным, но он обеспечивает четкую структуру и понятность команд.

    Основная функциональность скрипта:
    1. Создает GUI для ввода даты
    2. Проверяет корректность введенной даты
    3. Настраивает время BIOS для виртуальной машины VirtualBox
    4. Запускает виртуальную машину с модифицированными настройками времени

    какими строчками настраивается время
    В скрипте время настраивается несколькими ключевыми командами:

    1. Сначала отключается синхронизация времени с хостом:
    ```powershell
    start-process $VB_MANAGE 'setextradata', $vmname, 'VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled 1' -NoNewWindow
    ```

    2. Затем вычисляется смещение времени в миллисекундах:
    ```powershell
    $timeoffset_milliseconds='{0:0}' -f ([datetime]$date - [datetime]::Now).TotalMilliseconds
    ```

    3. И наконец, применяется смещение времени BIOS:
    ```powershell
    start-process $VB_MANAGE 'modifyvm', $vmname, '--biossystemtimeoffset', $timeoffset_milliseconds -NoNewWindow
    ```

    Здесь важно отметить несколько моментов:
    - Используется VBoxManage - утилита командной строки VirtualBox (путь хранится в переменной `$VB_MANAGE`)
    - Смещение вычисляется как разница между желаемым временем (`$date`) и текущим системным временем
    - Параметр `--biossystemtimeoffset` устанавливает смещение времени BIOS в миллисекундах

    После установки времени виртуальная машина запускается командой:
    ```powershell
    start-process $VB_MANAGE startvm, $vmname
    ```

    Похожий подход используется в проекте [github.com/bitbank2/rtc_setter](https://github.com..., где также реализована настройка времени, но для реального RTC (часов реального времени), а не виртуальной машины.

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

    Ответ написан
    5 комментариев
  • Возможно ли переписать это на PowerShell?

    @rPman
    В windows встроено (устанавливается из коробки) несколько языков программирования, начиная с javascript/vbasic в древнем windows scripting host (запускать программу в виде текстового файла .js или .vbs с помощь cscript.exe //nologo имя_файла.js) и заканчивая полноценного .net c#/vbs#/js# собираемого в .exe одной строчкой (никаких проектов, никаких студий, просто в редакторе пишешь код и запускаешь)

    Но люди продолжают ломать свои мозги, используя неадекватный ему инструмент что в windows (cmd и спасибо powershell лучше но все равно извращение, лучше он только потому что предоставляет больше доступа к windows-specific функционалу но не как язык программирования) так и в linux (когда я вижу, как люди в очередной раз пишут многостраничные простыни на bash чтобы работать с датами, вместо того чтобы написать код в пару строчек на python/php/..., мне становится грустно, куча всего в linux буквально написано на bash, поддерживать это неадекватное месиво ужасно.

    И да, я знаю, что бывает код на bash/powershell проще, но только потому что там уже есть решение проблемы, и весь этот код - просто способ описания этой проблемы.
    Ответ написан
    4 комментария
  • Как экстренно удалить профиль текущего пользователя Windows 10?

    @rPman
    Пишешь скрипт, удаляющий профил и файлы, и запускаешь его с помощью планировщика задач (не указываешь условие запуска, а запускаешь shctasks /run.

    Если тебе нужно каждый раз разные профили, то имя профиля где то храни, например в текстовом файле. На сколько я знаю передавать параметры планировщикау нельзя, но следи чтобы одновременно несколько не запускалось
    Ответ написан
    Комментировать
  • Что за кэш и почему вылетает ошибка?

    @rPman
    У тебя используется прокси с авторизацией?
    посмотри тут
    Ответ написан
    Комментировать
  • Найти ПК, у которых в сетевом адаптере старый DNS-сервер?

    @rPman
    У тебя должны быть инструменты запуска скриптов на всех машинах в сети (если нет, сделай это, вместе с инвенторизацией, ты должен знать где физически находится какая машина, как подключена, с каким железом и какими mac адресами)

    Выполни ipconfig /all на каждой машине и сохрани их вывод где то на сервере, там вся необходимая тебе информация - имя компьютера, наличие настройки dhcp или статика, список dns серверов, шлюз,...

    с помощью powershell вот метод
    Ответ написан
    Комментировать
  • Как изменить настройки сети через скрипт без запроса подтверждения от пользователя?

    @rPman
    Запуск любых приложений с правами администратора без запроса UAC возможен через настройку задания 'task scheduler', в настройках задания не указываешь тригер запуска, указываешь что нужны повышенные привилегии и при необходимости нужного пользователя, а затем в ярлыке запуска указываешь запуск этого задания через schtasks /run

    p.s. кстати не нашел как запретить пользователю пользоваться shtasks run для уже настроенных заданий
    Ответ написан
    Комментировать
  • Как написать простой powershell скрипт нажатия клавиш?

    @rPman
    запустить приложение с помощью &

    чтобы кнопки нажимать, можно использовать WScript.Shell
    $myshell = New-Object -com "Wscript.Shell"
    $myshell.sendkeys("q")
    Start-Sleep -m $delay


    p.s. очень неудобный ты выбрал инструмент для задачи
    есть специализированный autoit с языком, компилятором, редактором и кучей других утилит
    Ответ написан
    Комментировать
  • Как хранить и управлять большим количеством скриптов под разные задачи?

    @rPman
    Что значит управлять?

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

    На практике этой утилитой не пользовался, так как имея на руках красиво поименованные скрипты их можно и вручную в текстовом редакторе закидывать (я пользуюсь far, там удобно искать и выделять файлы по подстроке, копировать в буфер выделенные имена, и вставлять прямо построчным списком в виде текста).

    Извини, приложения не сохранилось, но оно реально простое, за вечер лениво пишется
    Ответ написан
    2 комментария
  • Запуск Ethernet адаптера программно (с помощью Bath или PowerShell)?

    @rPman
    Не powershell а просто штатная утилита netsh
    получаем список:
    netsh interface show interface

    выключаем
    netsh interface set interface "Network Connection 1" disable


    Еще есть управление устройствами и не только wmic:
    получить список с индексом в виде таблички
    wmic nic get name, index

    выключить устройство с индексом 2
    wmic path win32_networkadapter where index = 2 call disable
    Ответ написан
    Комментировать
  • ASP.NET Core 3.1 + IIS + Powershell SDK. Как запустить стороннее приложение через PowerShell на виртуальной машине?

    @rPman
    На сколько мне известно, единственный способ запустить процесс от пользователя, отличного от залогиненного, без запроса логина и пароля - это использование службы task scheduler (планировщик).

    Создаешь задачу без условий запуска, в свойствах указываешь что у тебя другой пользователь, вводишь логин пароль - все. Теперь чтобы запустить эту задачу нужно написать schtask /run ...

    p.s. тут обсуждалось как это сделать из power shell, но прав iis не хватит

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

    p.p.p.s. Когда то очень давно была сторонняя утилита srvany, которая поднимала службу, позволяющую запускать указанную утилиту под правами службы, а сами эти права настраивались в реестре.
    upd. во
    Ответ написан
    Комментировать