суббота, 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
}
}