Показаны сообщения с ярлыком PowerShell. Показать все сообщения
Показаны сообщения с ярлыком PowerShell. Показать все сообщения

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


Еще одна бесполезная для меня часть используемой мной 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"
}

суббота, 21 октября 2017 г.

Отключить Защитник Windows

Еще одна напрягающая мой старый ноутбук служба Windows - это её защитник.
Опять призываем на помощь себе запущенную рот имени системного администратора консоль PowerShell.

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

Get-ScheduledTask *defender* | Disable-ScheduledTask  

И добавляем в реестр параметр

New-ItemProperty -path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name "DisableAntiSpyware" -Value "1" -PropertyType "Dword"
New-ItemProperty -path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name "AllowFastServiceStartup" -Value "0" -PropertyType "Dword"
New-ItemProperty -path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name "ServiceKeepAlive" -Value "0" -PropertyType "Dword"

Перезагрузка. И ничего... оказывается Windows 10 Creator Update несколько по другому работает. Добавляем:

MkDir -path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name "Real-Time Protection"

New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection" -Name "DisableBehaviorMonitoring" -Value "1" -PropertyType "Dword"
New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection" -Name "DisableOAVProtection" -Value "1" -PropertyType "Dword"

MkDir -path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name "Spynet"

New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Spynet" -Name "DisableBlockAtFirstSeen" -Value "1" -PropertyType "Dword"
New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Spynet" -Name "LocalSettingOverrideSpynetReporting" -Value "0" -PropertyType "Dword"
New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Spynet" -Name "SubmitSamplesConsent" -Value "2" -PropertyType "Dword"



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

Удалить Windows Store


Как-то так сложилось, что я не устанавливаю приложения из Windows Store. А системные службы регулярно мешают мне работать создавая нагрузку на диск или процессор в виде сервиса wsappx. Поэтому пришло в голову удалить этот магазин из системы.

Выполнить это можно из консоли powershell в 3 шага:

  1. Команда "Get-AppxPackage *windowsstore* | Remove-AppxPackage", не забываем про автодополнение команд с помощью клавиши Tab.
  2. ?????
  3. Результат!
Как результат система быстрее запускается и меньше тормозит. Кстати, Очень полезно бывает отключить все живые плитки, чтобы коварная служба wsappx не тормозила работу. В той же консоли PowerShell вводим:
Set-ItemProperty -Path "HKCU:/Software/Policies/Microsoft/Windows/CurrentVersion/PushNotifications" -Name "NoTileApplicationNotification" –Value "1"

Так же до кучи можем очистить кэш плиток командой:

Set-ItemProperty -Path "HKCU:/SOFTWARE/Policies/Microsoft/Windows/Explorer" -Name "ClearTilesOnExit" -Value "1"
Конечно всё это можно запихнуть в сценарий, но надо ли?