foreach ($dev in (Get-PnpDevice | Where-Object{$_.Name -like "Tap*"})){ .\pnputil.exe /remove-device $dev.InstanceId }
пятница, 9 августа 2024 г.
Posh удалить все TAP устройства
среда, 31 июля 2024 г.
Zabbix server 2 IP
Имеется VPS (debian 12) с интерефейсом к сети Интернет (ens3) и во внутреннюю сеть организации (ens4). Основная адресация во внутренней сети 10.110.1.0/24, но в VLAN есть куча других сетей в пределах 10.110.0.0/16.
На VPS поднят zabbix сервер со своим доменом (zabbix.domain.ru), для внутренних подключений на роутере создана CNAME запись для домена на внутреннее имя zabbix.domain.ru=>zabbixOS.name.loc. В изначальной настройке /etc/network/interfaces все работало как то криво. Сервер отвечал на ping по внутреннему адресу, но порт 10051 для заббикса не отвечал. При этом снаружи все работало. Также пакеты не шли в дополнительные сети с самого сервера, только в основную. В итоге родился вот такой конфиг:
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug ens3
iface ens3 inet static
address 91.1.1.2/25
gateway 91.1.1.1
dns-nameservers 91.1.0.1 91.1.2.1
auto ens4
iface ens4 inet static
address 10.110.1.7
netmask 255.255.255.0
dns-nameservers 10.110.1.1
dns-search name.loc
post-up ip route add 10.110.1.0/24 dev ens4 src 10.110.1.7 table rt2
post-up ip route add default via 10.110.1.1 dev ens4 table rt2
post-up ip rule add from 10.110.0.0/16 table rt2
post-up ip rule add to 10.110.0.0/16 table rt2
Также надо не забыть добавить таблицу в /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
1 rt2
Для проверки:
ip route list table rt2
ip rule show
понедельник, 3 июня 2024 г.
CMD Объем носителей и свободное пространство
На просторах можно найти полный красивый скрипт, но мне достаточно вот этой строки для оценки
WMIC LogicalDisk WHERE "DriveType='3'" GET FreeSpace^, Name^, Size
суббота, 18 мая 2024 г.
Mikrotik поиск по логу
Найти сообщения содержащие указанный MAC
/log print where message~"A8:A1:59:7E:C6:6D"
суббота, 11 мая 2024 г.
RPi подключаем модем для обработки USSD и SMS
Ниже описан полный путь. В какой то момент я купил новый модем, но у него оказался API без поддержки USSD и я вернулся к старому. Поэтому не взыщите за столь длинный эпос
yser@rpi02:~ $ lsusb
Bus 001 Device 007: ID 12d1:1001 Huawei Technologies Co., Ltd. E161/E169/E620/E800 HSDPA Modem
Bus 001 Device 004: ID 0d9f:00a7 Powercom Co., Ltd UPS KIN-2200AP FW3.A7
Bus 001 Device 005: ID 0d9f:0002 Powercom Co., Ltd Black Knight PRO / WOW Uninterruptible Power Supply (Cypress HID->COM RS232)
Bus 001 Device 006: ID 0424:7800 Microchip Technology, Inc. (formerly SMSC)
Bus 001 Device 003: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
user@rpi02:~ $ cat lsusb_ext.sh
#!/bin/bash
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
(
syspath="${sysdevpath%/dev}"
devname="$(udevadm info -q name -p $syspath)"
[[ "$devname" == "bus/"* ]] && exit
eval "$(udevadm info -q property --export -p $syspath)"
[[ -z "$ID_SERIAL" ]] && exit
echo "/dev/$devname - $ID_SERIAL"
)
done
user@rpi02:~ $ ./lsusb_ext.sh
/dev/ttyUSB2 - HUAWEI_Technology_HUAWEI_Mobile
/dev/ttyUSB3 - HUAWEI_Technology_HUAWEI_Mobile
/dev/ttyUSB1 - HUAWEI_Technology_HUAWEI_Mobile
/dev/ttyUSB0 - POWERCOM_CO.__LTD._USB_to_Serial
Исполнить правила devrul без перезапуска/перевыдергивания
sudo udevadm control --reload-rules && sudo udevadm trigger
Чего то с тем модемом не взлетело. Купил E3372h-153, вроде как с ним должно быть проще, но нет
среда, 8 мая 2024 г.
Sendmail двоеточие
При использовании sendmail и eocat может возникнуть проблема с обработкой двоеточий в теле. Для обхода используйте пустую строку перед телом. Например сохранять тело письмо не так
echo "My text: this text" | tee file.txt
а в от так
echo -e "\nMy text: this text" | tee file.txt
или sed c cat
from=lte@domain.ru
to=it@domain.ru
( cat <<EOCAT
MIME-Version: 1.0
From: $from
To: $to
Subject: [ROOM][LTE][SMS]
Content-Type: text/plain
EOCAT
cat file.txt |sed -E '1 s/^(.*)$/\n\1/g' ) | /usr/sbin/sendmail -t
пятница, 3 мая 2024 г.
Dissalow all robots.txt nginx
Тестируем вот такой вариант блокировки индексации поисковыми роботами при помощи nginx
location /robots.txt {
return 200 "User-agent: *\nDisallow: /";
}
Также можно исползовать X-Robots-Tag, но говорят, что не все роботы поддерживают их
location / {
add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive";
}
Хотел решить задачу именно nginx`ом, так как он выступает в качестве reverse proxy, а конечный сервер часто пересобирается, можно и забыть о такой маленькой настройке
Ошибка установки Element
Инструкция с сайта по установке element
sudo apt install -y wget apt-transport-https
sudo wget -O /usr/share/keyrings/element-io-archive-keyring.gpg https://packages.element.io/debian/element-io-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/element-io-archive-keyring.gpg] https://packages.element.io/debian/ default main" | sudo tee /etc/apt/sources.list.d/element-io.list
sudo apt update
sudo apt install element-desktop
Ошибка NO_PUBKEY C2850B265AC085BD
Вот так ошибки нет
sudo apt install -y wget apt-transport-https
echo "deb https://packages.element.io/debian/ default main" | sudo tee /etc/apt/sources.list.d/element-io.list
wget -qO- https://packages.element.io/debian/element-io-archive-keyring.asc | sudo tee /etc/apt/trusted.gpg.d/element.asc
chmod 644 /etc/apt/trusted.gpg.d/element.asc
apt-get update
sudo apt install element-desktop
В следующий раз проверю права на /usr/share/keyrings/element-io-archive-keyring.gpg, может достаточно их поправить.
Для запуска двух element с разными аккаунтами нужно создать и поправить ярлык.
/opt/Element/element-desktop --profile default1
/opt/Element/element-desktop --profile default2
вторник, 30 апреля 2024 г.
Что можно сказать о классике? Завоеванный статус принадлежит ей по праву. Мы видим и представляем одну Америку - сегрегация населения, но она не одна. Нет, не хочу сказать, что данная ситуация была только в Америке, на фоне промышленной революции, но не много стран, которые могли бы потягаться в схожих ситуациях. Лишь хотелось бы, чтобы история не повторилась, а она повторится....
"Гроздья гнева", Джон Стейнбек
суббота, 27 апреля 2024 г.
воскресенье, 21 апреля 2024 г.
Docker Nextcloud изменить BaseURL
Казалось бы, что может проще как изменить базовый URL?
А что такое базовый url? Классический базовый URL раньше выглядел так http://mydomen.ru/nextcloud
При этом nextcloud установлен по пути /var/www/html/nextcloud, а DocumentRoot в настройках веб-сервера /var/www/html
Потом появился параметр RewriteBase, который позволял убрать из url nextcloud, тем самым сократив его и сделав красивым.
суббота, 20 апреля 2024 г.
Keepass клик по URL - открытие SCP соединения с автоматической авторизацией в WinSCP
В 4ый раз делать скрин мне лень, логика та же |
Отталкиваясь от описания можно заставить KeePass открывать SCP соединение с автоматической авторизацией в WinSCP. Cтрочка "URL override":
cmd://%systemdrive%\progra~2\WinSCP\WinSCP.exe {BASE:RMVSCM} /newinstance /username={USERNAME} /password={PASSWORD}
У WinScp отдельного параметра для порта нет, поэтому без извращений
вторник, 9 апреля 2024 г.
Трилогия "Воспоминания о прошлом Земли". Лю Цысинь. Первая часть - "Задача трех тел" очень понравилась, от остальных ожидал чего то большего, но тоже не плохо. Конец правда несколько разочаровал, так как он, как и бесконечность, никак не укладывается в рамки. Перед прочтением я смотрел обе части "Блуждающая земля", поэтому некоторые вещи ярко вставали перед внутренним взором. Только потом я узнал, что автор у произведений один. После всей трилогии новости о космических достижениях воспринимаются по другому ))
"Не говорите мне где она находится. Если вы мне скажете где она находится, то мир сразу сужается до размеров одной карты"
"Но здесь уже есть всё что я могу себе вообразить зачем тогда живопись"
"Если бог есть, то верить в него правильно, а если нет, то я ничего не теряю"
воскресенье, 7 апреля 2024 г.
Excel VBA Создать Word документы по списку из excel
Прилетела задача:
Имеем таблицу с колонками (допустим ФИО, контакты, кой какие данные)
Нужно для каждой строки создать отдельный Word документ по шаблону и заполнить данными из строки. Шаблоны могут быть разными.
В общем задача в голове разворачивается, я понимаю как ее сделать теми методами, что чаще использую - 1С. Но задачу надо решить силами Excel. Так как план работы "программы" есть, остается дело за малым - выразить его в VBA. Да, занимает чуть дольше, так как я практически не использую данный язык и приходится спрашивать у гугла - "как описывается цикл" и прочее, но результатом заказчик доволен.
К чему мы пришли:
- В первой строке у колонок с нужными данными должны быть уникальные названия латиницей.
- Обязательно должен быть столбец KeyWord, в нем содержится ключевой слово для определения текущего шаблона (Template_%KeyWord%.docx)
- Также должен быть столбец FIO, и должен быть заполнен, иначе строка будет пропущена
- Шаблон должен находится в папке с файлом excel с макросом
- В шаблоне используем "элемент управления содержимым". Название его соответствует названию колонки в excel документе
Если при работе программы элемент не будет найден, то он будет пропущен.
Все, дальше добавляем кнопку в excel документ и связываем его с этим макросом, все должно работать. Будут созданы файлы "Act %KeyWord%.docx" с необходимым заполнением.
суббота, 6 апреля 2024 г.
понедельник, 1 апреля 2024 г.
RPi 3B+ DHT11/22 Monitoring
На данный момент в "серверной" мы проверяем температуру при помощи камеры направленной на термометр от Xiaomi. Работу кондиционера оцениваем по веревочкам, т.е. если они колышатся, то кондиционер работает. Также на самой камере настроено оповещение на почту при наличии движения от этих веревочек два раза в сутки. Логика простая: есть движение - отправить письмо, нет движения - нет письма. Нет письма - реагируем. У меня есть RaspberryPi и датчик температуры/влажности DTH11. Малинка стоит в серверной, так почему бы мне не научить малину считывать температуру? Почему бы не мониторить температуру заббиксом, чтобы оповещать при критической ситуации?
Сначала подключим к малине датчик
Для работы сенсора буду использовать Adafruit, надо установить (предполагается что pip3 и python уже стоят на малине, моя ОС на базе Debian 12):
user@rpi02:~$ sudo pip3 install Adafruit_Python_DHT --break-system-packages
пятница, 29 марта 2024 г.
1С:Заготовка Поиск по GTIN номенклатуры при загрузке из ТабДокумента
Менеджер получил новые GTIN для продукции, которая уже заведена в 1С УТ и имеет собственный GTIN, при этом наименование товара также заменили в соответствии с новыми правилами ЧЗ. Плюс к списку прилагались 2000 марок к остаткам. Все было выполнено в специальной конфигурации Хамелеон. Бухгалтер попросила помочь с загрузкой марок в 1С УТ, так как в УТ остаток есть, а приход размазан на год.
Самый простой вариант для разового варианта - ЗагрузкаДанныхИзТабличногоДокумента_УФ_v2.epf, но он не умеет находить по GTIN из коробки. А мне нужно:
- Добавить GTIN к существующей карточке номенклатуры
- Заменить наименования в карточке
- Загрузить марки в базу
Вот такой код:
М = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
М.Отбор.Штрихкод.Установить(?(СтрДлина(ТекстЯчейки)=13,ТекстЯчейки,строка("0"+ТекстЯчейки)));
М.Прочитать();
Результат=М[0].Номенклатура;
Сообщить(М[0].Номенклатура);
Да, код не оптимален, но для разовой загрузки подойдет, ибо на загрузку в таком варианте ушло не больше 20 минут (вспомнить как писать на 1С тоже занимает время X-D), а на разработку полноценного решения ушло бы часа 2 О_О
Один момент, для исправления наименования GTIN помещаем в поле Код, для поля код ставим галку поле поиска, а алгоритм вычисления кода правим вот так:
М = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
М.Отбор.Штрихкод.Установить(?(СтрДлина(ТекстЯчейки)=13,ТекстЯчейки,строка("0"+ТекстЯчейки)));
М.Прочитать();
Результат=М[0].Номенклатура.Код;
Сообщить(М[0].Номенклатура);
вторник, 26 марта 2024 г.
RPi 3B+ NUT UPS Monitoring
Имеем два ИБП Powercom KING PRO KIN-2200AP RM и Powercom KING PRO KIN-3000AP RM и RaspberryPi на собственном ИБП на базе 18650
Хочу мониторить и управлять ИБП с малины. К малине подключены при помощи USB кабеля (2 метра)
Дальше идет описание моих изысканий со всеми ошибками.
Ищем наши ИБП
user@rpi02:~ $ lsusb
Bus 001 Device 004: ID 0d9f:00a7 Powercom Co., Ltd UPS KIN-2200AP FW3.A7
Bus 001 Device 005: ID 0d9f:0002 Powercom Co., Ltd Black Knight PRO / WOW Uninterruptible Power Supply (Cypress HID->COM RS232)
В /etc/nut/nut.conf указываем режим работы сервер
MODE=server
В /etc/nut/ups.conf я их записал так (согласно документации данная модель
[KIN_2200AP]
driver = usbhid-ups
desc = "KIN-2200AP"
port = auto
vendorid = 0d9f
productid = 00a7
[KIN_3000AP]
driver = usbhid-ups
desc = "KIN-3000AP"
port = auto
vendorid = 0d9f
productid = 0002
Попытка запуска завершилась ошибкой
could not detach kernel driver from interface 0: Operation not permitted
пятница, 22 марта 2024 г.
среда, 13 марта 2024 г.
PoSh Script Проверка web сервиса и перезапуск docker desktop
Сервис развернут контейнере (Docker desktop). Пожаловались, что иногда он вываливается и единственное решение - полный перезапуск wsl и "docker desktop". Пользователь в будуюшем будет переносить докеры в linux среду, а на текущий момент нужен костыль. Сразу оговорюсь, попытка создать службу docker провалилась, поэтому здесь решение совсем грязное. Но в самом скрипте есть пара интересных, для меня, моментов, поэтому кладу его здесь.
Скрипт проверяет ответ от web-сервиса (внешний адрес и порт), если его нету, то ждет N время, иначе выходит. По истечении N времени идет повторная проверка, если ответа нет, то идет проверка локальная, иначе выход. Если локальная проверка не прошла, то перезапускаем нужные службы и программы, иначе выходим.
Запускать я решил батником в task scheduller, чтобы не править каждый раз задачу. При этом задача должна выполнятся от имени администратора и БЕЗ привязки к пользователю, иначе Desktop manager не запустит контейнеры.
Два триггера
Для автозапуска Docker desktop при загрузке ПК настраиваем автовход пользователя (control userpasswords2) и автозапуск Docker desktop при входе в настройках программы. На данный момент это единственное рабочее решение из найденных :-(
Команда запуска в планировщике (окно скрипта скрыто)
%windir%\system32\cmd.exe
/c start /min C:\usr\WSLCheckStart.bat ^& exit
Будьте осторожны с таким методом скрытия окна. Этот метод открывает скрипт за пределами планировщика. Планировщик не может контролировать выполнение задачи, а значит возможно наложение нескольких задач. Для таких случаев рекомендуется проводить проверку в самом скрипте.
Батник:
@echo off
cd %~dp0
set "pathscript=%~dp0\WSLCheck.ps1"
set "pathlog=%~dp0\log"
mkdir %~dp0\log
IF EXIST %pathscript% (
powershell.exe -NoProfile -ExecutionPolicy Bypass -File %pathscript% -Address "dev.site.com" -Port "443" -LocalPort "8080" -TimeOut 20 -TimeOutHTTP 10 -LogFile %pathlog%
) ELSE (
echo "ERROR! %pathscript% not exist"
echo "ERROR! %pathscript% not exist" >> WSLLogStart.log
)
Сам скрипт Powershell
Posh script Простенькая функция логирования
# Имя файла лога отличается от имени скрипта только расширением
$ScriptPath=(Get-Item $PSCommandPath).Directory
$ScriptBaseName=(Get-Item $PSCommandPath).BaseName
$LogFile="$ScriptPath\$ScriptBaseName.log"
$whatif=$false
# простенькая функция логирования, если файл есть, то пишет в него
# можно было использовать tee-object, но этот командлет выдает ошибку при отсутствии папки для лога
# CheckRepeat проверяет последнюю строку лога с будущей, чтобы не засорять файл
# level - число -
function Logging($Message,$Level=0,$CheckRepeat=$false){
if ("$Message" -eq ""){
return
}
$mLevel=switch($level){
0 {New-Object psobject -Property @{label="[INF]";color="White"}}
1 {New-Object psobject -Property @{label="[WAR]";color="Yellow"}}
2 {New-Object psobject -Property @{label="[ERR]";color="Red"}}
}
$CurrentTimeStamp=Get-Date -Format "dd.MM.yyyy`tHH:mm:ss"
Write-Host "$Message" -ForegroundColor $mLevel.color
if ($whatif){return}
if (-not (Test-Path $LogFile)) {New-Item -Path $LogFile -ItemType File -ErrorAction SilentlyContinue}
if (Test-Path $LogFile) {
$lastLine=""
if ($CheckRepeat){
$lastLine=$(Get-Content -Path $LogFile)[-1].Split("`t")[-1]
}
if ("$Message" -ne "$lastLine"){
Write-Output("$CurrentTimeStamp`t$($mLevel.label)`t$Message") | Out-File $LogFile -Append
}
}
}
суббота, 24 февраля 2024 г.
пятница, 23 февраля 2024 г.
Bash скрипт заметка
Заметка скрипт.
Интересный моменты в скрипте:
- Вызов функции из себя как вариант цикличности, а не рекурсии
- $EUID -ne 0
Проверка на наличие root прав у текущего пользователя - echo -e "[User]\nSystemAccount=true"> /var/lib/AccountsService/users/$AdminName
Скрытие учетки в *nix-подобных системах (сервисный аккаунт) - logname
Получение имени залогинившегося пользователя, даже если он под sudo - eval getent passwd {$UID_MIN..$UID_MAX}
eval - преобразует текст в команду - getent passwd {1000..6000} | cut -d: -f1
получение списка пользователей с UID между 1000-6000, все сервисные аккаунты имеют UID < 1000 - blkid -U "$(grep -vE "^#|^$" /etc/crypttab | tail -n1 | cut -d" " -f1 | cut -d"-" -f2-)"
LUKS иногда создает устройство с именем равным LUKS-UUID_source_block_device, но вот получить именно адрес в виде /dev/sda3 не так просто
- Проверить наличие определенного пользователя
- Создать администратора, при его отсутствии
- Переименовать выбранного пользователя
- Сбросить ID Anydesk
- Изменить passphrase для шифрованного раздела
- Переименовать ПК
четверг, 22 февраля 2024 г.
QEMU KVM Два монитора
Появилась интересная задачка - организация рабочего места на съемном носителе (ssd). Ну интересное тут другое, там используется виртуализация на базе QEMU. Установка и настройка производились на Hyper-V (виртуализация в виртуализации) на внешний ssd (проброшен в VM).
Установка QEMU выглядела так:
sudo apt-get install --no-install-recommends qemu-system-ppc libvirt-daemon-system libvirt-clients virt-manager gir1.2-spiceclientgtk-3.0
Вот я сделал, а заказчик спрашивает, а как мне работать на двух мониторах?
Поясню, на носителе базовая операционная система, а в ней есть гипервизор QEMU KVM. Человек запускает виртуальную машину и работает через консоль. А у него два монитора и растянуть окно нельзя.
В поисках решений перепробовал много вариантов, в итоге решение нашлось.
среда, 21 февраля 2024 г.
Script posh Keepass Выбор профиля Chrome
По-умолчанию двойной клик по полю url с протоколом https/http открывает новую вкладку chrome в ближайшем окне (если смотреть по порядку). При этом не важно, какой там профиль. Меня это не устраивает. Поэтому я начал искать пути решения.
Первый вариант был привязать тег keepass к папке и добавлять его как параметр --profile-directory, но оказывается я не могу использовать теги.
Следующий вариант был - получить в окне powershell список профилей из каталога %userprofile%\AppData\Local\Google\Chrome\User Data\, но тут лежат не только профили, а сами профили имеют отличные, от заданных в chrome, имена. В итоге выяснилось, что информация об именах и каталогах хранится в файле %userprofile%\AppData\Local\Google\Chrome\User Data\Local State. Это JSON файл, и, к сожалению, в одну строчку распарсить его не получится. Поэтому родился вот такой скрипт с дополнительными проверками. Скрипт выдает таблицу
пятница, 16 февраля 2024 г.
воскресенье, 11 февраля 2024 г.
Script Posh Сформировать список файловых баз 1С рекурсивно
Переношу 1С с одного сервера на другой, основные базы были клиент-серверные, переводим в файловую и добавляем в список. Делов на пять минут, так как их не много. А вот в файловых базах целая туча без логики во вложенности. Решил накидать скрипт, который сам сформирует список баз. Скрипт проходит рекурсивно, ищет файл базы 1Cv8.1CD и строит дерево. Если в каталоге нет файла БД и нет подкаталогов, то пропускает, во всех остальных случаях добавляет в файл списка баз. Из за этого возможны пустые каталоги
$Folder="D:\1C_BASES\Базы1с_8"
$filev8i="$Folder\bases_here.v8i"
$level=1
function CheckName{
param(
[Parameter()]
[string]$Name,
[Parameter()]
[string]$File,
[Parameter()]
[int]$cnt=1
)
$content=$(Get-Content $File)
if ($content | Select-String -Pattern "[$Name]" -SimpleMatch -Quiet){
$cnt=$cnt+1
$res=$(CheckName -Name "$Name ($cnt)" -File $file -cnt $cnt)
}else{
$res=$Name
}
return $res
}
function GetTree{
param(
[Parameter()]
[string]$Folder,
[Parameter()]
[string]$Parent="",
[Parameter()]
[int]$level
)
$ChildList=$(Get-ChildItem -Path $Folder -Directory)
foreach ($child in $ChildList){
$FullPath=$($child.FullName)
$NameParentFolder=$Parent
if (Test-Path "$FullPath\1Cv8.1CD"){
$pref="-"*$($level)+"|->"
Write-Host("$pref Folder `"$child`" with 1C Bases")
$Name=$(CheckName -Name $child -File $filev8i)
$Text=@"
[$Name]
Connect=File=`"$FullPath`";
ID=
OrderInList=
Folder=$($NameParentFolder.Replace("\","/"))
OrderInTree=
External=0
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.3
AppArch=Auto
DisableLocalSpeechToText=0
DisableLocalSpeechToText=0
"@
Write-Output($text) | Out-File -Encoding "UTF8" $filev8i -Append
} else {
if ($(get-childitem $FullPath -Directory).count -gt 0){
$pref="-"*$level+"|->"
Write-Host("$pref Folder `"$child`":")
$Name=$(CheckName -Name $child -File $filev8i)
$text=@"
[$name]
ID=
Folder=$($NameParentFolder.Replace("\","/"))
"@
Write-Output($text) | Out-File -Encoding "UTF8" $filev8i -Append
GetTree -Folder $FullPath -Parent "$NameParentFolder\$name" -level $($level+1)
} else {
$pref="-"*$level+"|->"
Write-Host("$pref Folder `"$child`" not contain subfolders")
}
}
}
}
Remove-Item -Path $filev8i -Force
$currentParent=$(($Folder.Split("\"))[-1])
$text=@"
[$currentParent]
ID=
Folder=/
"@
Write-Output($text) | Out-File -Encoding "UTF8" $filev8i -Append
GetTree -Folder $Folder -level $level -Parent "/$currentParent"
Скрипт мою задачу решил, наводить лоск смысла не вижу смысла
воскресенье, 4 февраля 2024 г.
Script Posh Восстановление acl в папке пользователя
В попытке настроить аудит, у меня сломался acl для пользовательских папок. Если бы речь шла об одной папке, то я бы решил этот вопрос простым удалением папки пользователя и его повторным входом в систему. Но речь шла о терминальном сервере. Поэтому родился этот скрипт. Единственно что надо учесть:
- Скрипт рассчитан на русскую локализацию
- Скрипт обрабатывает только каталоги внутри пользовательского
- Скрипт подразумевает, что имя каталога совпадает с именем пользователя
- Скрипт рассчитан на то, что владельцем каталога пользователя является системная учетная запись, а все дочерние принадлежат пользователю. На разных системах по разному.
- Сам скрипт использует icacls, вместо get-acl.
- Входящими параметрами скрипта является имя пользователя и домен, если домен не указан, то скрипт будет использовать имя ПК, с которого запущен (на тесте были ошибки, но мне не нужно было и не стал исправлять).
param(
[Parameter()]
[string]$User,
[Parameter()]
[string]$Domain=$env:COMPUTERNAME
)
$LogFile = (Get-Item $PSCommandPath ).DirectoryName+"\"+(Get-Item $PSCommandPath ).BaseName+".log"
$CurrentTimeStamp=Get-Date -Format "dd.MM.yyyy`tHH:mm:ss"
function Logging($Message) {
Write-Host "$Message"
Write-Output("$CurrentTimeStamp`t$Message") | Out-File $LogFile -Append
}
if ($User) {
Logging("User $User in $Domain is processing")
} else {
Logging("Parameter `"User for processing (-User)`" is not specified ")
exit
}
$UserFolder="C:\users\$User"
if (-Not (Test-Path $UserFolder)) {
Logging("User folder $UserFolder not found")
Exit
}
function getAcls ($ObjectFS){
switch ($ObjectFS)
{
"Application Data" {return "SYSTEM"}
"Local Settings" {return "SYSTEM"}
"NetHood" {return "SYSTEM"}
"PrintHood" {return "SYSTEM"}
"SendTo" {return "SYSTEM"}
"главное меню" {return "SYSTEM"}
"Мои документы" {return "SYSTEM"}
"Шаблоны" {return "SYSTEM"}
Default {return "FULL"}
}
}
foreach ($ObjectFS in $(Get-ChildItem -Path $UserFolder -Force -Exclude "ntuser*","AppData")) {
$ObjectFSFullName=$($ObjectFS.FullName)
Logging(" Object $ObjectFSFullName is processing")
#ICACLS
$ACL= getAcls($ObjectFS.BaseName)
Logging(" $ACL")
Logging(" ICACLS $ObjectFSFullName /setowner $Domain\$user")
ICACLS $ObjectFSFullName /setowner $Domain\$user /C /Q
Logging(" ICACLS $ObjectFSFullName /C /Q /RESET")
ICACLS $ObjectFSFullName /C /Q /RESET
if ( "$ACL" -eq "SYSTEM" ) {
Logging(" ICACLS $ObjectFSFullName /setowner `"NT AUTHORITY\СИСТЕМА`" /c /q")
ICACLS $ObjectFSFullName /setowner "NT AUTHORITY\СИСТЕМА" /c /q
Logging(" ICACLS $ObjectFSFullName /deny `"Все:(NP)(S,RD)`" /c /q")
ICACLS $ObjectFSFullName /deny "Все:(NP)(S,RD)" /c /q
}
}
четверг, 1 февраля 2024 г.
вторник, 30 января 2024 г.
воскресенье, 28 января 2024 г.
AHK управление аудиоустройством не по-умолчанию
Повесил себе колонку для фоновой музыки. Уровень громкости там около 6 единиц, при этом на основной колонке требуется уровень >30. В общем Windows 10 позволяет настроить вывод на разные аудиоустройства, но управление громкостью возможно только в том, которое выбрано сейчас.
#Requires AutoHotkey v2.0
; Use the Soundcard Analysis script found here to set these parameters
; https://www.autohotkey.com/docs/v2/lib/Sound.htm#ExSoundcard
DeviceNumber := 3
ComponentID := ""
savedVol := 0
LShift & Volume_Up::{
SoundSetVolume("+2", ComponentID, DeviceNumber)
}
LShift & Volume_Down::{
SoundSetVolume(-2, ComponentID, DeviceNumber)
}
LShift & Volume_Mute::{
global savedVol
currentVol := SoundGetVolume(ComponentID, DeviceNumber)
if (currentVol > 0){
savedVol := currentVol
SoundSetVolume(0, ComponentID, DeviceNumber)
} else {
SoundSetVolume(savedVol, ComponentID, DeviceNumber)
}
}
Скрипт найден на просторах интернета, я лишь уточнил, что реагируем не на стандартные клавиши, а на их сочетание с левым шифтом. device number подобран эмпирическим путем. Теперь стандартные клавиши (mute, Volume Up, Volume Down) работают как раньше на текущее основное аудиоустройство, а сочетание с shift - только на устройств с Device Number равным 3, т.е. в моем случае колонка Dell
AHK Переключение раскладки между двумя последними
Когда пишешь код для 1С на кириллице, приходится постоянно переключаться между раскладками, так как в коде используются некоторые символы, доступные только в латинской раскладке. Да можно настроить клавиатуру под себя, но мне это не очень удобно. Поэтому я вынужден постоянно переключаться между раскладками. В какой то момент обратил внимание на то, что раскладка не успевает переключиться за то время, как я нажимаю клавиши. Выяснилось, что у windows есть таймаут нажатия и правится он в реестре:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response]
"DelayBeforeAcceptance"="50"
А когда у меня добавилась раскладка, выяснилось, что нельзя настроить переключение не иначе, как каруселью (стандартными средствами). Сегодня случайно узнал, что есть комбинация Win-Ctrl-Space, которая позволяет переключаться между двумя последними, как в gboard. А потом нашелся скрипт для autoHotKey, который позволяет сменить стандартное поведение alt+shift на эту волшебную комбинацию. Выбор другой раскладки можно оставить за win+Space или настроить при помощи стандартных средств.
Скрипт для ahk v1 и не мой, я лишь добавил {LAlt up}{LShift up}, так как у меня иногда "залипают" эти клавиши. Идея оказалась так себе, так как стало еще хуже
; This scripts changes the functi onality of Shift + Alt from "switch keyboard layout"
; to "change to previous layout".
; this is usefull when you have more than 2 keyboard layouts and want to switch between
; only 2 of them.
LAlt & LShift::send, #^{space down}{space up}
; Замена Alt-Shift на Win-Ctrl-Space
Теперь надо отучиться дважды переключать раскладку X-D
Неожиданно выяснилось, что эта штука ведет себя некорректно в сеансах RDP O_O. Пришлось сгруппировать процессы exe в группу и сказать скрипту работать, только если активное окно не входит в эту группу
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
GroupAdd, RDP_EXE, ahk_exe RDCMan.exe
GroupAdd, RDP_EXE, ahk_exe mRemoteNG.exe
GroupAdd, RDP_EXE, ahk_exe mstsc.exe
#IfWinNotActive ahk_group RDP_EXE
LAlt & LShift::send, #^{space down}{space up} ; Замена Alt-Shift на Win-Ctrl-Space
#If
суббота, 27 января 2024 г.
пятница, 26 января 2024 г.
CMD Симлинки в профиле пользователя
Как посмотреть симовлические ссылки в Windows
dir /AL /S "C:\Users\%username%"
А это список ссылок, которые есть в профиле пользователя (пысы, случайно грохнул содержимое своей папки пользователя О_О)
mklink /j "C:\Users\%username%\Application Data" "C:\Users\%username%\AppData\Roaming"
mklink /j "C:\Users\%username%\Cookies" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Cookies"
mklink /j "C:\Users\%username%\Local Settings" "C:\Users\%username%\AppData\Local"
mklink /j "C:\Users\%username%\NetHood" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Network Shortcuts"
mklink /j "C:\Users\%username%\PrintHood" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Printer Shortcuts"
mklink /j "C:\Users\%username%\Recent" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Recent"
mklink /j "C:\Users\%username%\SendTo" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo"
mklink /j "C:\Users\%username%\Главное меню" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu"
mklink /j "C:\Users\%username%\Мои документы" "C:\Users\%username%\Documents"
mklink /j "C:\Users\%username%\Шаблоны" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Templates"
mklink /j "C:\Users\%username%\AppData\Local\Application Data" "C:\Users\%username%\AppData\Local"
mklink /j "C:\Users\%username%\AppData\Local\History" "C:\Users\%username%\AppData\Local\Microsoft\Windows\History"
mklink /j "C:\Users\%username%\AppData\Local\Temporary Internet Files" "C:\Users\%username%\AppData\Local\Microsoft\Windows\Temporary Internet Files"
mklink /j "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Программы" "C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs"
mklink /j "C:\Users\%username%\Documents\Мои видеозаписи" "C:\Users\%username%\Videos"
mklink /j "C:\Users\%username%\Documents\Мои рисунки" "C:\Users\%username%\Pictures"
mklink /j "C:\Users\%username%\Documents\Моя музыка" "C:\Users\%username%\Music"