Задать вопрос
  • Как убрать лишний вывод в консоль?

    @NortheR73
    системный инженер
    В выводе же видно какой WMI-класс его генерирует, соответственно, идете в нужный участок кода и вносите правки:
    $computer_sys.Put() | Out-Null
    ...
    $page_file.Put() | Out-Null

    Можно вообще однострочником обойтись, например:
    Set-WmiInstance -Class Win32_PageFileSetting -Arguments @{name="C:\pagefile.sys"; InitialSize = 4096; MaximumSize = 8192} -EnableAllPrivileges | Out-Null
    Ответ написан
    Комментировать
  • Как работает локальный DNS в домене?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Локальные зоны, далее stub зоны и conditional forwarders, затем запросы через forwarders и если они пустые то к корневым серверам через root hints.
    Вот так и работает и какого черта нельзя было это нагуглить или хотя бы увидеть в настройках dns сервера
    Ответ написан
    Комментировать
  • Почему скрипт запуска виртуальной машины перестал работать?

    @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 комментариев
  • Как настроить сохранение Отправленных в другой ящик?

    @NortheR73
    системный инженер
    Как это сделать - прекрасно описано в официальной документации и разных блогах, делается через PowerShell. Там два параметра всего - один для тех, у кого есть Send As, второй - для Send On Behalf
    Начните уже читать документацию по Exchange и Exchange PowerShell и пользоваться поиском :)

    З.Ы. скормите свой вопрос гуглу - сильно удивитесь...
    Ответ написан
    Комментировать
  • Как реализовать на форме PowerShell GUI окно выбора файлов?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Логично, что System.Windows.Forms.SaveFileDialog
    Add-Type -AssemblyName System.Windows.Forms
    
    # Создание диалогового окна сохранения файла
    $saveFileDialog = New-Object System.Windows.Forms.SaveFileDialog
    $saveFileDialog.InitialDirectory = [System.Environment]::GetFolderPath('Desktop') # Стартовый каталог
    $saveFileDialog.Filter = "Текстовые файлы (*.txt)|*.txt|Все файлы (*.*)|*.*" # Фильтр типов файлов
    $saveFileDialog.Title = "Выберите место для сохранения файла"
    $saveFileDialog.DefaultExt = "txt" # Расширение по умолчанию
    
    # Отображение диалога и обработка результата
    if ($saveFileDialog.ShowDialog() -eq "OK") {
        $savePath = $saveFileDialog.FileName
        Write-Host "Файл будет сохранен по пути: $savePath"
    } else {
        Write-Host "Сохранение отменено пользователем."
    }
    Ответ написан
    2 комментария
  • Как в Exchange 2019 создать автоответ всем, кроме одного отправителя?

    @NortheR73
    системный инженер
    например:
    1. создать обычный автоответ (можно в Outlook, а лучше с помощью Set-MailboxAutoReplyConfiguration). Во внешнем сообщении (External Message) можно использовать какой-нибудь ключевой набор слов.
    2. создать транспортное правило для исходящей почты: получатель, которого надо исключить, и в теме письма есть слова "Automatic reply:" или в теле письма содержится ключевой набор слов - просто удалять письмо
    3. Настройку автоответа и транспортное правило включать/выключать одновременно

    З.Ы. со времен Exchange 2013 автоответ отправляется каждому отправителю только один раз. Если надо отправлять автоответ каждый день - выключаем/включаем настройки каждый день
    Ответ написан
    Комментировать
  • Есть ли утилита для упаковки папки с файлами в несколько архивов, без разделения файлов на части?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Проблема явно высосана из пальца.
    Если нужны "самодостаточные архивы", то и запаковывать надо по файлам/папкам, а не вот это вот мракобесие. В общем случае проходим по папкам и архивируем каждую

    for i in */; do zip -r "${i%/}.zip" "$i"; done

    В данном конкретном случае 99% объема раздачи составляют файлы .db. Вот их и надо заархивировать, по отдельности. А всё остальное оставить как есть. И тогда этим "облаком" можно будет хоть как-то пользоваться, без нанайских национальных плясок, распаковывая по 10 чемоданов, чтобы достать один файл.
    find . -type f -name '*.db' -exec zip -m {}.zip {} \;

    В винде всё это тоже легко пишется.

    Но сначала надо оценить саму необходимость возиться с архивирванием, чтобы сэкономить 30 гигов из 180.
    Ответ написан
    4 комментария
  • Возможно ли переписать это на PowerShell?

    @d-stream
    Готовые решения - не подаю, но...
    вот скормил ии и он даже на cmd сотворил
    for %%F in ("%source_folder%\*") do (
        call rling "%%~fF" "%compare_folder%"
        type result.txt >> %output_file%
        del /q result.txt


    на powershell
    if (!(Test-Path $outputFile)) {
        New-Item -Path $outputFile -Force | Out-Null
    }
    Get-ChildItem -Path $sourceFolder -File | ForEach-Object {
        & rling $_.FullName $compareFolder
        Get-Content -Path '.\result.txt' | Add-Content -Path $outputFile
        Remove-Item -Path '.\result.txt' -ErrorAction SilentlyContinue
    }


    ну и да, если предварить каждую команду в исходном тремя буковками wsl - то тоже будет результат)

    p/s/ кстати интересная логика у ии)
    Ответ написан
    4 комментария
  • Как ускорить выполнение powershell скрипта?

    @FluffyBeaver
    Kekxx, ну, не WMI, а WinRM.
    PowerShell Direct для того, чтобы администрировать виртуальные машины. Использовать его как замену удалённого доступа на стенде или в домашних условиях, конечно, можно. Но причина "по другому не работает" тут, скорее, индикатор, что инструмент выбран неверно.

    Если просто забить в Google ту строку, что возвращает PsExec, то уже на странице поиска будет понятно, что там написано.

    А если сопоставить этот вопрос и прошлый(-лые), то создаётся впечатление, что это попытка наваять что-то мутное на коленке.
    ______________________________
    Что касается вопроса - одновременный запуск проще будет сделать используя планировщик или ожидание нужного времени в самом скрипте
    (разумеется, надо убедиться в синхронизации времени между узла и).
    ______________________________
    Что касается проблемы доступа к ВМ, предположу, что это ПК и виртуальная машина не входят в домен, то есть, используют [разные] локальные учётные записи, а ошибки вызванв попытками использовать учётную запись одного узла в качестве учётной записи для другого узла.
    Ответ написан
    Комментировать
  • Как автоматизировать сбор данных о размере файла с множества удаленных машин?

    @NortheR73
    системный инженер
    PowerShell-скриптом и собирайте (тэг же соответствующий поставили)...
    Полный путь к файлу известен - проверяете наличие файла и его размер на удаленных компах. Если надо писать результаты именно в Excel - в скрипте создаете COM-объект Excel.Application и работаете с ним. Для простоты и быстроты я бы писал результаты в CSV-файл (Excel умеет с ними работать)
    Ответ написан
    1 комментарий
  • Возможно ли без костылей тихо установить VNC Server с установкой пароля?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Называется "тихая установка". В мануале всё подробно описано: https://www.tightvnc.com/doc/win/TightVNC-installe...
    Ответ написан
    Комментировать
  • Как проверить 500 000 файлов word,exel,pdf ,txt что они не битые?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    "Новые" офисные форматы (.docx, .xlsx, ...) - это по факту zip-архивы.

    Новый (пустой) документ Excel распакуется в виде, ЕМНИП, шести папок и примерно десятка файлов.

    Соответственно, их целостность можно проверить с помощью 7-Zip.

    Но с .pdf такой фокус не пройдёт.

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

    Анализаторы энтропии встроены в некоторые инструменты для data recovery, но они работают немного по-другому и с накопителями в целом.
    Утилиты для отдельных файлов я сходу не назову, хотя почти уверен, что она должна существовать. Поищите в составе инструментов для forensic в духе Kali Linux и подобного.
    Также посмотрите что используют те, кто анализируют прошивки, дампы чипов, и занимаются подобным реверс-инжинирингом.

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

    @NortheR73
    системный инженер
    Лучше создайте отдельную сервисную УЗ и наделите необходимыми правами (как минимум - Logon As A Service)
    из описания New-Service:
    -Credential
    Specifies the account used by the service as the Service Logon Account.
    Ответ написан
    Комментировать
  • Как быстро узнавать название пк пользователя чтобы каждый раз не идти в систему учёта?

    @NortheR73
    системный инженер
    в дополнение к предыдущим ответам...
    где каждому сотруднику присвоен ПК

    1. если есть AD, то у каждого пользователя в свойствах можно указать ПК, на которые он может ходить (это атрибут LogonWorkstations)
    2. если у вас установлено однозначное соответствие между пользователем и ПК и оно не меняется (или меняется крайне редко) - можно статично установить в описании (Description) пользователя имя ПК, а в описании ПК - имя пользователя
    3. варианты с динамическим изменением описания/атрибутов с помощью скрипта коллеги уже дали в ответах
    Ответ написан
    Комментировать
  • Как добавить в Exchange 2019 в динамическую рассылку несколько подразделений Active Directory через PowerShell?

    @NortheR73
    системный инженер
    1. Для создания DDG из нескольких OU можно использовать параметр RecipientFilter, а сам фильтр построить заранее и проверить, что он возвращает нужный набор ящиков (пример)
    2. У всех получателей Exchange есть группа атрибутов CustomAttribute1..15. Можно какому-то из этих атрибутов присваивать уникальное значение, а потом строить DDG с использованием параметра ConditionalCustomAttribute1..15.
    Вместо 'AllRecipients' лучше использовать, например, "MailboxUsers,MailGroups" (зачем вам ресурсные ящики или контакты в DDG?)
    не забываем описание - New-DynamicDistributionGroup
    Ответ написан
    Комментировать
  • Скрипт powershell использует слишком много памяти. Что я делаю не так?

    @conJOULA Автор вопроса
    Удалось добиться желаемого поведения использовав другой подход (другую фичу), которая называется ForEach-Object -Parallel. Если кто-то случайно забредёт сюда в поисках ответа, можете попробовать следующее:

    $threadslimit = 8
    $collection = @{}
    $synccollection = [System.Collections.Hashtable]::Synchronized($collection)
    
    1..1000 | ForEach-Object {
        $data = @('some', 'valuable', 'text', 'data')
        $synccollection.Add($_, $data)
    }
    
    #выводим созданную коллекцию до изменений, просто чтобы можно было сравнить
    $synccollection
    
    $keys = @($synccollection.Keys)
    
    $keys | ForEach-Object -Parallel {
        $synccollectionscope = $using:synccollection
    
        # Здесь на самом деле какая-то функция, которая возвращает строку
        $format = 'Changed data'
    
        # Изменяем одно из полей, напоминаю, по ключам лежат массивы
        $synccollectionscope[$_][3] = $format
    
        # Тут вывод чтобы просто отслеживать выполнение скрипта
        Write-Output "Data was changed"
    
    } -ThrottleLimit $threadslimit
    
    # Вывод самой коллекции в консоль, чтобы убедиться, что значения поменялись
    $synccollection


    Делает то же самое, использует практически нулевое количество памяти, работает быстрее.
    Ответ написан
    1 комментарий
  • Странный ServerDN при проверке автонастройки почты Exchange. Это нормально?

    @dshumov Автор вопроса
    Олдскул - Фигурнов форева
    Сам спросил и сам отвечаю :)
    Наверное это справедливо и для Exchange 2019
    Under Exchange 2013 Architecture:

    “Second, Outlook clients no longer connect to a server FQDN as they have done in all previous versions of Exchange. Outlook uses Autodiscover to create a new connection point comprised of mailbox GUID, @ symbol, and the domain portion of the user’s primary SMTP address. This simple change results in a near elimination of the unwelcome message of “Your administrator has made a change to your mailbox. Please restart.” Only Outlook 2007 and higher versions are supported with Exchange 2013.”
    Ответ написан
    Комментировать
  • Как правильно удалить определенные учетные записи windows 10 через powershell?

    @NortheR73
    системный инженер
    для одного локального пользователя - примерно так (у вас это все должно быть в цикле по всем компам):
    $localuser = Get-LocalUser -Name $USERNAME
    $localuser | Remove-LocalUser -Confirm:$false
    
    $userprofile = Get-CimInstance -Class Win32_UserProfile | Where-Object { $_.SID -eq $localuser.SID }
    $userprofile | Remove-CimInstance -Confirm:$false
    Ответ написан
    Комментировать
  • Почему корректно не выполняется PS-скрипт?

    @0x0f80
    Потому что значение параметра -SearchBase не заключено в кавычки, и интерпретируется как массив вместо строки.
    Ответ написан
    Комментировать
  • Как сделать миграцию с Exchange 2013-2019?

    @NortheR73
    системный инженер
    Надеюсь, документ от Exchange Team ответит на ваши вопросы: Best Practices for Migrating from Exchange 2013 to...
    Ответ написан
    Комментировать