воскресенье, 12 ноября 2017 г.

Отключение адаптивной смены яркости в Windows 10

Долгое время не мог понять, что же меня раздражает при активной работе на ноутбуке сWindows 10. Оказалось, что при изменении картинки на экране,  например при смене вкладки браузера со светлой страницы Яндекса на странцу с видео YouTube, происходило адаптивное изменение яркости подсветки экрана. Очень раздражающая штука.

Легко отключить это не получилось, в настройках электропитания уже была отключена.

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

Делается это в диспетчере устройств. Правой клавишей на видеоадаптере, из контекстного меню выбираем пункт "Обновить драйвер..." >  "Выполнить поиск драйверов на этом компьютере" > "Выбрать драйвер из списка доступных драйверов на этом компьютере". Откроется окно выбора драйвера,  в котором выбираем "Базовый видеоадаптер (Microsoft)".

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

суббота, 4 ноября 2017 г.

Удаление службы с помощью Powershell


Подхватил недавно Adware которые насоздавал кучу лишних служб, таких как updater.mail.ru. Конечно, в состав Windows 10 входит отличная утилита SC с помощью которой их легко можно удалить:

 sc delete updater.mail.ru.

Но удивил тот факт что в составе Powershell есть командлеты для создания, настройки и управления службами, но вот для удаления нет.  Есть костыли использующие WMI

(Get-WmiObject win32_service -Filter ″name=′updater.mail.ru′″).delete()

или прямое удаление ветки реестра относящийся к службе в разделе:

HKLM:\SYSTEM\CurrentControlSet\Services\

но вот командлета нет. Искал на powershelgallery.com и в стандартной поставке. Отличный пример когда соберусь изучать создание командлетов. наверняка это из-за каких-подводных камней. хотя конечно можно просто обёртку для sc.exe написать, что совсем не интересно.

Формирование HTML из Powershell кода в ISE


Увидел как убого выглядит вставляемый код и поискал способ для формирования расцвеченного HTML кода для вставки в статьи блога. Поскольку я использую Powershell совсем не часто, то функционала стандартного ISE мне выше крыши. Так что первым делом попытался найти способ сделать это из этого инструмента.

Нашёл хорошую статью на wiki technet Wiki: Как вставить отформатированный код сценария PowerShell в TechNet Wiki. Но увы PowerShellPack уже вышел в тираж.

Зато на той же wiki нашёл страницу с дополнениями для самого ISE. Одним из которых был Copy As HTML Add-On. Удобная штука с собственным установщиком. Пришлось правда использовать set-executionpolicy, но это и так пришлось бы делать. Схоронил у себя этот архивчик.

В статью Блогера код вставляется в режиме HTML. И выглядит один-в-один как в редакторе:

$path = "d:\temp\"

$files = Get-ChildItem $path

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false

$Summary = @()

foreach ($file in $files) {
     #Открываем каждый из полученных файлов
    $excel.Workbooks.Open($file.fullname) | Out-Null
    
    
    [int] $Year = "20" +$File.name.substring($file.name.Length - 6,2);
    
    [int] $Month = $file.name.substring($file.name.Length - 9,2);
    
    Write-Host "Open file: " $file.FullName "; Year = " $Year "; Month = " $month
    #Получаем перечень с именами листов длиной менее трёх символов - листы с данными по дням имеют имена в два символа
    $Sheets = $excel.worksheets | where {$_.Name.length -lt 3}
    $plan = 0
    $fact = 0
    #Для каждого из полученных листов в файле проводим разбор
    foreach ($Sheet in $Sheets)  {
        [int] $Day = $Sheet.Name
        
        for ($Col = 7; $Col -le 8; $Col++) {
            For ($Row =14; $Row -le 16; $Row++) {
                if ($sheet.cells.item($Row, $Col).Value2 -eq "Койко/мест") {
                    #Write-host $year $Month $Day "-" $Col ":" $Row  = "YES!"
                    #Write-Host "Day = " $Day "; Fact Value = " $sheet.cells.item($Row, $Col + 2).Value2 "; PlanValue = " $sheet.cells.item($Row + 1, $Col + 2).Value2

                    
                    #$DataDay = New-Object PsObject
                    #$DataDay | Add-Member -MemberType noteproperty -Name Year -Value $Year
                    #$DataDay | Add-Member -MemberType noteproperty -Name Month -Value $Month
                    #$DataDay | Add-Member -MemberType noteproperty -Name Day -Value $Day
                    #$DataDay | Add-Member -MemberType noteproperty -Name FactValue -Value $sheet.cells.item($Row, $Col + 2).Value2
                    #$DataDay | Add-Member -MemberType noteproperty -Name PlanValue -Value $sheet.cells.item($Row + 1, $Col + 2).Value2
                    
                    
                    #$Summary += $DataDay
                    $plan +=$sheet.cells.item($Row + 1, $Col + 2).Value2
                    $fact +=$sheet.cells.item($Row, $Col + 2).Value2
                }
            }
        }
    }
                $DateMonth = New-Object PsObject
                    $DateMonth | Add-Member -MemberType noteproperty -Name Year -Value $Year
                    $DateMonth | Add-Member -MemberType noteproperty -Name Month -Value $Month
                    $DateMonth | Add-Member -MemberType noteproperty -Name FactValue -Value $Fact
                    $DateMOnth | Add-Member -MemberType noteproperty -Name PlanValue -Value $Plan
            $Summary += $DateMonth

}
$Summary | Out-GridView

#$table = @()
#   for ($i=2010; $i -le 2011; $i++) {
#        For ($j = 1; $j -le 12; $j++) {
#            $temp = $summary | where {$_.Month = $j} | where {$_.Year = $i}
#            $Fact = 0
#            $Plan = 0
#            foreach ($t in $temp) {
#                $fact += $t.FactValue
#                $plan += $t.PlanValue
#            }
#            
#            $DateMonth = New-Object PsObject
#                    $DataMonth | Add-Member -MemberType noteproperty -Name Year -Value $Year
#                    $DataMonth | Add-Member -MemberType noteproperty -Name Month -Value $Month
#                    $DataMonth | Add-Member -MemberType noteproperty -Name FactValue -Value $Fact
#                    $DataMOnth | Add-Member -MemberType noteproperty -Name PlanValue -Value $Plan
#            $table += $dateMonth
#        }
#    
#    }






Администратор заблокировал выполнение этого приложения.


Система защиты Windows при всей своей неэффективности в то же время достаточно сложна и эшелонирована. Так элементы обеспечения безопасности Defender и UAC, который кстати раньше обозначался как  Limited User Account (LUA), способны работать в связке. Приводя к блокировке потенциально опасных для системы приложений. Вот и я столкнулся с этим, при том что и UAC и Defender я старательно отключил, приложение было блокировано из-за сертификата издателю которого система не доверяет. При этом использование функции "Запуск от имени администратора" привело к повторному появлению указанного окна.

Удалось запустить исполняемый файл из командной консоли, которая в свою очередь и была запущена от имени Администратора. Но это не очень удобно. Ниже представлен Powershell скрипт вносящий изменения в ветку реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\ System\EnableLUA
для отключения функционала ограниченного пользовательского аккаунта (LUA). Естественно при отключении еще одного средства защиты система становится ещё более подверженной вторжению.

<#
Отключает LUA
#>
$RegPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
$RegProperty = "EnableLUA"

Set-ItemProperty -path $RegPath -Name $RegProperty -value "0"


<#
Включает LUA
#>
$RegPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System"
$RegProperty = "EnableLUA"

Set-ItemProperty -path $RegPath -Name $RegProperty -value "1"


Отключить Поиск Windows


Еще одна бесполезная для меня часть используемой мной Windows 10 - это поиск. Сервис который бесполезно тратить оперативную память и процессорное время.  Не так много, но курочка по зёрнышку...

Как всегда оформлю всё в виде Powershell скрипта, чтобы не возиться с GUI утилитами.

$RegPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Search"
$RegPathShort = "HKLM:\SOFTWARE\Policies\Microsoft\Windows"
$RegProperty = "AllowCortana"


if (test-path $RegPath) {
$y = Get-ItemPropertyValue -path $RegPath -Name $RegProperty -ErrorVariable x -ErrorAction SilentlyContinue
    if ($y) {
        Set-ItemProperty -path $RegPath -Name $RegProperty -value "0"
    }
    else {
        New-ItemProperty -path $RegPath -Name $RegProperty -Value "0" -PropertyType "Dword"
    }
}
else {
    mkdir -path $RegPathShort -name "Windows Search"
    New-ItemProperty -path $RegPath -Name $RegProperty -Value "0" -PropertyType "Dword"
}