В комментариях статьи про diskusage читатель спросил, может ли утилита показать размер папки C:\Windows\CSC
, где хранится кэш автономных файлов.
Очевидно, в его организации с проблемой сталкиваются регулярно, а для анализа приходится выключать ОС ;)
Сегодня я покажу способ, позволяющий решать такие задачи, не прекращая работу Windows. В качестве примера я решу проблему читателя двумя способами — с помощью diskusage и PowerShell. Причем подход вполне актуален для diskusage, поскольку утилита на данный момент не видит содержимое папок, на которые у администратора нет прав.
Вы можете применять этот способ для любых задач! Объем файлов в папке — просто пример.
И да, все составляющие сегодняшнего рассказа – это компиляция ранее опубликованных в блоге решений.
[+] Сегодня в программе
Сторонние средства: psexec
В командной строке от имени администратора команда dir сообщает об отсутствии папки C:\Windows\CSC
. Однако PowerShell подтверждает наличие пути и сообщает, что для доступа недостаточно прав.
Вообще-то, в статье про diskusage я изначально ссылался на способ с psexec, позволяющий интерактивно запускать приложения от имени системы. Другими словами, с помощью утилиты можно было запустить командную строку или PowerShell от имени SYSTEM…
psexec64 -i -s cmd
…и узнать, что для доступа в папку нужны права SYSTEM :)
Дальше можно просто выполнять необходимые команды.
Системные средства: планировщик заданий
Допустим, что стороннее ПО, даже с подписью Microsoft из набора sysinternals, строго запрещено службой безопасности и/или блокируется политиками. Однако с правами администратора можно создавать и выполнять задания в планировщике для запуска команд и скриптов.
Например, я показывал в блоге автоматическое выполнение задач на восходе и закате солнца. Там ключевую роль играло запланированное задание, которое запускается от имени системы. Здесь тот же подход.
Шаг 1 — Создайте простое задание на разовый запуск программы
В качестве действия укажите:
- Команда:
powershell
- Параметры для выполнения команды:
-ExecutionPolicy Bypass -Noprofile -Command ваша_команда
или
Параметры для выполнения скрипта:-ExecutionPolicy Bypass -Noprofile -File путь_к_файлу.ps1
В нашем примере diskusage запускается с желаемыми ключами командной строки и записывает результат в файл. Пример параметров для планировщика.
-ExecutionPolicy Bypass -Noprofile -Command "diskusage /humanReadable C:\Windows\CSC | Out-File -FilePath C:\temp\out.txt"
За неимением утилиты используем PowerShell — считаем и складываем размер всех файлов во всех папках (конечно, я не рекомендую применять этот подход ко всему диску :).
-ExecutionPolicy Bypass -Noprofile -Command "[math]::Round(((Get-ChildItem -Path C:\Windows\CSC -Recurse | Measure-Object length -Sum).Sum)/1mb,1) | Out-File -FilePath C:\temp\out.txt"
Шаг 2 — Настройте задание на запуск от имени системы
На вкладке Общие нажмите Изменить и введите SYSTEM или СИСТЕМА в зависимости от локализации.
Автоматизацию создания таких запланированных задач я разбирал с помощью schtasks и PowerShell. Остается запустить задание и открыть созданный файл. Все просто!
В отличие от psexec, из планировщика не работает интерактивный запуск приложений. Например, редактор реестра запустится, но взаимодействовать вы с ним не сможете. Однако выполнение команд и скриптов с правами системы отлично работает.
Заключение
Я всегда ощущаю некоторую неловкость, когда пишу для блога или канала Telegram материал, не содержащий ничего нового [относительно моих предыдущих публикаций]. Но я понимаю, что не все читали старые записи, равно как из поисковиков приходит множество людей по конкретным запросам. Поэтому какая-то польза от этого должна быть.
В данном случае у меня была и дополнительная мотивация. Фактически, эта статья – затравка для следующей, в которой мы посмотрим на эту же тему под более интересным углом.
artem
Залогинился, чтобы написать, что размер папки CSC надо смотреть через DISM. Пока логинился, вспомнил, что CSC и SXS это всё-таки разные вещи. Но названия так похожи.
Vadim Sterkin
Размер sxs я смотрел в предыдущей статье. Я конечно люблю его смотреть, но не настолько :))
Artem Pronichkin
Ладно, раз никто больше не комментирует, напишу ещё про драйверы. В той статье комментарии уже закрыты, поэтому напишу тут.
Кто-то там хотел узнать, какой драйвер используется устройствами в настоящий момент. Действительно, Get-PnPDevice этого не показывает, и это выглядит как досадное недоразуменее. Но на самом деле показывает другой коммандлет:
Собственно, если бы я решал такую же задачу, как ты в том посте, то я бы построил логику именно на этой информации. Т.е. получить список всех драйверов в системе (через Get-WindowsDriver), из них отбросить те, которые используются существующими устройствами (через Get-PnpDeviceProperty), а оставшиеся удалить.
Vadim Sterkin
Спасибо, не знал. Так, конечно, более конкретная выборка. Но думаю, что предположение «используется драйвер с самой новой датой» тоже ок.
Stanislav Vershinin
Спасибо за статью.
Действительно psexec внесен в черный список, и запуск его не возможен.
Планировщик, затратен по времени приготовления. Но, я нашел программу PowerRun, которая может запускать процессы от имени SYSTEM и даже TrustedInstaller.
запуск, работает идеально.
Vadim Sterkin
Пожалуйста :)
Которую нормальный отдел ИБ вычислит после первого запуска и внесет в черный список :) Но я добавлю в статью Как получить доступ к разделу реестра и вернуть все на свои места, там коллекция…
В смысле в GUI? А одна команда в консоли это тоже затратно? Да, ее нет в статье, и PowerShell выглядит сложно, но schtasks никто не отменял и примеры есть в блоге.
dmitry tarakanov
Как всегда забыли про олдскульную коммандную строку безо всяких пауэршеллов.
at /?
Vadim Sterkin
C:\>at /?
The AT command has been deprecated. Please use schtasks.exe instead.
AT вам не даст и трети того, что может schtasks, про которую я уже не раз писал в блоге.