Полезные твики Windows. Автоматизация на PowerShell Печать

Каждый раз при переустановке операционной системы Microsoft Windows 8.1 или Windows 7 многие из нас сталкиваются с одними и теми же рутинными задачами, цель которых привести рабочую среду к более удобному состоянию, позволяющему наилучшим образом выполнять свою работу, не задумываясь об остальном. В этой статье я поделюсь простыми и нужными твиками для Вашей операционной системы Microsoft (версии Windows 7 и выше).

Точно следуя написанному, Вы сможете автоматизировать следующее:

  • Автоматический перенос пользовательских папок с системного диска C: на диск D: с миграцией существующих данных
  • Автоматическое переименование метки дисков C: и D: (изменение названия логических дисков)
  • Заблокировать надоедающую рекламу в настольной версии Skype
  • Заблокировать отправку шпионских данных операционной системой

Приведенные твики можно скомпоновать в единый PowerShell скрипт по Вашему желанию. Таким образом Вы существенно снизите ваши трудовые затраты, а главное свое время.

Почему PowerShell? Зачем он нам нужен?

Учитывая, что PowerShell это скриптовый язык, не требующий предварительной компиляции, Вы всегда можете самостоятельно дополнить тело скрипта. Тем самым быстро расширив его функционал либо изменив необходимую Вам настройку. Кроме того, из PowerShell Вы сможете без проблем запустить внешнюю команду или исполняемый файл с необходимыми аргументами, что еще больше расширяет возможности написания сценария.

На мой взгляд, язык сценариев Microsoft PowerShell в дальнейшем будет стремительно развиваться и все больше и больше пользователей, в том числе и пользователей клиентских рабочих станций, будут прибегать к его использованию в своих нуждах. Также не станет удивлением, если через некоторое время Microsoft добавит базовый функционал PowerShell и в свои мобильные версии операционных систем, устанавливаемые на подобные смартфоны Windows Phone 8.1 http://price.ua/smartfony_windows_phone_8_1/ccid1871.html

Главное преимущество PowerShell по сравнению со многими другими командными оболочками - это унифицированные команды (командлеты). Один раз поняв их принцип, можно будет писать серьезные сценарии, даже не имея доступа к интернет и пользуясь только встроенной справкой Get-Help и командлетом Get-Command

Как с этим работать? Куда вставлять код PowerShell?

Человек, который ни разу не работал с PowerShell, резонно задаст первый вопрос: "Куда же вставлять весь этот код?". Ответ прост: вставлять нужно в саму оболочку, запущенную с повышенными правами администратора.

В меню "Пуск" в строке поиска пишем "powershell", после чего в найденных результатах нажимаем правой кнопкой мыши на "Windows PowerShell" и выбираем "Запуск от имени администратора". Если все сделано правильно, откроется синее окошко. Это и есть оболочка Windows PowerShell.

powershell-tweaks-01

 

Следует также знать что для того, чтобы вставить текст из буфера обмена в оболочку PowerShell, нужно нажать правую кнопку мыши в окне оболочки (сочетание Ctrl+V тут по умолчанию работать не будет). Создавать же сценарии лучше в специальной оболочке PowerShell ISE.


Автоматический перенос пользовательских папок с системного диска C: на диск D:. Миграция существующих данных

Конечно было бы неплохо, чтобы на Вашем компьютере были установлены два дисковых накопителя. Однако даже если у Вас один винчестер, который логически поделен на два раздела C: (система) и D: (данные), я все равно рекомендую держать всю пользовательскую информацию на отдельном от системного разделе (хотя бы для того, чтобы при необходимости отформатировать раздел с Windows, не нужно было задумываться на счет сохраненных документов, изображений, видео, аудио и других важных файликов, сохраненных на Рабочем столе).

 
if (Test-Path -LiteralPath 'D:\')
{
    $curUser = "$env:USERDOMAIN\$env:USERNAME"

    if (!(Test-Path -LiteralPath 'D:\_DESKTOP'))
        {
            Write-Host -ForegroundColor DarkGray "START: Migrate Desktop"

            New-Item -Path "D:\_DESKTOP" -ItemType Directory -Force | Out-Null
            Start-Process -FilePath "$env:SystemRoot\System32\xcopy.exe" -Wait -WindowStyle Minimized -ArgumentList """$env:USERPROFILE\Desktop\*"" ""D:\_DESKTOP"" /C /H /K /O /X /R /E /I /G /Q /Y"
            $getDir = Get-Item -Path "D:\_DESKTOP"
            $getDir.Attributes = "Hidden, System"

            Start-Process -FilePath "$env:SystemRoot\System32\icacls.exe" -Wait -WindowStyle Minimized -ArgumentList """D:\_DESKTOP"" /grant:r *S-1-5-18:(OI)(CI)(F) /inheritance:r"
            Start-Process -FilePath "$env:SystemRoot\System32\icacls.exe" -Wait -WindowStyle Minimized -ArgumentList """D:\_DESKTOP"" /grant ""$curUser"":(OI)(CI)(F) /inheritance:r"

            Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders' -Name 'Desktop' -Value 'D:\_DESKTOP' | Out-Null
            Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders' -Name 'Desktop' -Value 'D:\_DESKTOP' | Out-Null
        }


    if (!(Test-Path -LiteralPath 'D:\_DOWNLOADS'))
        {
            Write-Host -ForegroundColor DarkGray "START: Migrate Downloads"

            New-Item -Path "D:\_DOWNLOADS" -ItemType Directory -Force | Out-Null
            Start-Process -FilePath "$env:SystemRoot\System32\xcopy.exe" -Wait -WindowStyle Minimized -ArgumentList """$env:USERPROFILE\Downloads\*"" ""D:\_DOWNLOADS"" /C /H /K /O /X /R /E /I /G /Q /Y"
            $getDir = Get-Item -Path "D:\_DOWNLOADS"
            $getDir.Attributes = "ReadOnly"

            Start-Process -FilePath "$env:SystemRoot\System32\icacls.exe" -Wait -WindowStyle Minimized -ArgumentList """D:\_DOWNLOADS"" /grant:r *S-1-5-18:(OI)(CI)(F) /inheritance:r"
            Start-Process -FilePath "$env:SystemRoot\System32\icacls.exe" -Wait -WindowStyle Minimized -ArgumentList """D:\_DOWNLOADS"" /grant ""$curUser"":(OI)(CI)(F) /inheritance:r"

            Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders' -Name '{374DE290-123F-4565-9164-39C4925E467B}' -Value 'D:\_DOWNLOADS' | Out-Null
            Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders' -Name '{374DE290-123F-4565-9164-39C4925E467B}' -Value 'D:\_DOWNLOADS' | Out-Null
        }


    if (!(Test-Path -LiteralPath 'D:\_DOCUMENTS'))
        {
            Write-Host -ForegroundColor DarkGray "START: Migrate Documents"

            New-Item -Path "D:\_DOCUMENTS" -ItemType Directory -Force | Out-Null
            Start-Process -FilePath "$env:SystemRoot\System32\xcopy.exe" -Wait -WindowStyle Minimized -ArgumentList """$env:USERPROFILE\Documents\*"" ""D:\_DOCUMENTS"" /C /H /K /O /X /R /E /I /G /Q /Y"
            $getDir = Get-Item -Path "D:\_DOCUMENTS"
            $getDir.Attributes = "ReadOnly"

            Start-Process -FilePath "$env:SystemRoot\System32\icacls.exe" -Wait -WindowStyle Minimized -ArgumentList """D:\_DOCUMENTS"" /grant:r *S-1-5-18:(OI)(CI)(F) /inheritance:r"
            Start-Process -FilePath "$env:SystemRoot\System32\icacls.exe" -Wait -WindowStyle Minimized -ArgumentList """D:\_DOCUMENTS"" /grant ""$curUser"":(OI)(CI)(F) /inheritance:r"

            Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders' -Name 'Personal' -Value 'D:\_DOCUMENTS' | Out-Null
            Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders' -Name 'Personal' -Value 'D:\_DOCUMENTS' | Out-Null
        }


    if (!(Test-Path -LiteralPath 'D:\_AUDIO'))
        {
            Write-Host -ForegroundColor DarkGray "START: Migrate Audios"

            New-Item -Path "D:\_AUDIO" -ItemType Directory -Force | Out-Null
            Start-Process -FilePath "$env:SystemRoot\System32\xcopy.exe" -Wait -WindowStyle Minimized -ArgumentList """$env:USERPROFILE\Music\*"" ""D:\_AUDIO"" /C /H /K /O /X /R /E /I /G /Q /Y"
            $getDir = Get-Item -Path "D:\_AUDIO"
            $getDir.Attributes = "ReadOnly"

            Start-Process -FilePath "$env:SystemRoot\System32\icacls.exe" -Wait -WindowStyle Minimized -ArgumentList """D:\_AUDIO"" /grant:r *S-1-5-18:(OI)(CI)(F) /inheritance:r"
            Start-Process -FilePath "$env:SystemRoot\System32\icacls.exe" -Wait -WindowStyle Minimized -ArgumentList """D:\_AUDIO"" /grant ""$curUser"":(OI)(CI)(F) /inheritance:r"

            Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders' -Name 'My Music' -Value 'D:\_AUDIO' | Out-Null
            Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders' -Name 'My Music' -Value 'D:\_AUDIO' | Out-Null
        }


    if (!(Test-Path -LiteralPath 'D:\_PICTURES'))
        {
            Write-Host -ForegroundColor DarkGray "START: Migrate Pictures"

            New-Item -Path "D:\_PICTURES" -ItemType Directory -Force | Out-Null
            Start-Process -FilePath "$env:SystemRoot\System32\xcopy.exe" -Wait -WindowStyle Minimized -ArgumentList """$env:USERPROFILE\Pictures\*"" ""D:\_PICTURES"" /C /H /K /O /X /R /E /I /G /Q /Y"
            $getDir = Get-Item -Path "D:\_PICTURES"
            $getDir.Attributes = "ReadOnly"

            Start-Process -FilePath "$env:SystemRoot\System32\icacls.exe" -Wait -WindowStyle Minimized -ArgumentList """D:\_PICTURES"" /grant:r *S-1-5-18:(OI)(CI)(F) /inheritance:r"
            Start-Process -FilePath "$env:SystemRoot\System32\icacls.exe" -Wait -WindowStyle Minimized -ArgumentList """D:\_PICTURES"" /grant ""$curUser"":(OI)(CI)(F) /inheritance:r"

            Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders' -Name 'My Pictures' -Value 'D:\_PICTURES' | Out-Null
            Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders' -Name 'My Pictures' -Value 'D:\_PICTURES' | Out-Null
        }


    if (!(Test-Path -LiteralPath 'D:\_VIDEO'))
        {
            Write-Host -ForegroundColor DarkGray "START: Migrate Videos"

            New-Item -Path "D:\_VIDEO" -ItemType Directory -Force | Out-Null
            Start-Process -FilePath "$env:SystemRoot\System32\xcopy.exe" -Wait -WindowStyle Minimized -ArgumentList """$env:USERPROFILE\Videos\*"" ""D:\_VIDEO"" /C /H /K /O /X /R /E /I /G /Q /Y"
            $getDir = Get-Item -Path "D:\_VIDEO"
            $getDir.Attributes = "ReadOnly"

            Start-Process -FilePath "$env:SystemRoot\System32\icacls.exe" -Wait -WindowStyle Minimized -ArgumentList """D:\_VIDEO"" /grant:r *S-1-5-18:(OI)(CI)(F) /inheritance:r"
            Start-Process -FilePath "$env:SystemRoot\System32\icacls.exe" -Wait -WindowStyle Minimized -ArgumentList """D:\_VIDEO"" /grant ""$curUser"":(OI)(CI)(F) /inheritance:r"

            Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders' -Name 'My Video' -Value 'D:\_VIDEO' | Out-Null
            Set-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders' -Name 'My Video' -Value 'D:\_VIDEO' | Out-Null
        }
}

Для вступления изменений в силу нужно перезагрузить компьютер.

 

Автоматическое переименование метки дисков C: и D: (изменение названия логических дисков)

Еще один интересный сценарий автоматизации переименует Ваши логические диски C и D в определенный формат. Например, если у Вас в системе установлен один физический дисковый накопитель (попросту один винчестер), то ваши логические диски станут выглядеть таким образом: Disk-1_SYSTEM (C:) и Disk-1_WORK (D:). А если у Вас два физических дисковых накопителя, один из которых отформатирован под логический раздел C, а другой под логический раздел D, то ваши логические диски станут: Disk-1_SYSTEM (C:) и Disk-2_WORK (D:).

Write-Host -ForegroundColor DarkGray "START: Logical disks renaming"
[string]$DiskClabel = 'SYSTEM'
[string]$DiskDlabel = 'WORK'

foreach ($Drive in Get-WmiObject win32_diskDrive )
{
    [byte]$CurrentDisk = $Drive.Index + 1
    $did = $Drive.deviceid.replace('\','\\')

    foreach ( $Partition in Get-WmiObject -query ('associators of {win32_diskdrive.deviceid="' + $did + '"} where assocclass = win32_diskDriveToDiskPartition') )
    {
        foreach ($Disk in Get-WmiObject -query ('associators of {win32_diskpartition.deviceid="' + $Partition.deviceID + '"} where assocclass = win32_logicalDiskToPartition'))
        {
            switch ($Disk.DeviceID)
            {
                "C:" {$DiskClabel = "Disk-" + $CurrentDisk + "_SYSTEM"}
                "D:" {$DiskDlabel = "Disk-" + $CurrentDisk + "_WORK"}
            }

            if ( ($DiskDlabel -ne 'WORK') -and ($DiskClabel -ne 'SYSTEM') )
            {
                break
            }
        }
    }
}

Get-CimInstance Win32_LogicalDisk -Filter "deviceID = 'c:'" | Set-CimInstance -Property @{volumename= $DiskClabel}
Get-CimInstance Win32_LogicalDisk -Filter "deviceID = 'd:'" | Set-CimInstance -Property @{volumename= $DiskDlabel}

Для того, чтобы данный сценарий отработал в операционной системе Windows 7, нужно убедиться что версия оболочки PowerShell не ниже 3.0. Если версия ниже, понадобится предварительно установить dotNet Framework 4 (ссылка) и затем соответствующий пакет обновления PowerShell (ссылка).

 

Заблокировать надоедающую рекламу в настольной версии Skype

Надоели анимированные рекламные картинки в приложении Skype? Выполните следующий сценарий:

Write-Host -ForegroundColor DarkGray "START: Skype advertisement disabling"

$spyURLs = @(
"`n"
"`n"
"`n"
'# -----====== START BLOCK: Skype advertisement URLs disabling. Please visit http://Vam.in.UA ======-----'
'127.0.0.1 apps.skype.com' 
'127.0.0.1 api.skype.com' 
'127.0.0.1 static.skypeassets.com'
'127.0.0.1 rad.msn.com'
'127.0.0.1 adriver.ru'
'# -----====== END BLOCK: Skype advertisement URLs disabling. Please visit http://Vam.in.UA ======-----'
) 

Out-File -FilePath "$env:SystemRoot\System32\drivers\etc\hosts" -InputObject $spyURLs -Force -Append -Encoding default

 

Заблокировать отправку шпионских данных операционной системой

И напоследок хотелось бы поделиться сценарием, который занесет в файл hosts ссылки URL, на которые осуществляется отправка операционными системами Microsoft статистической информации. Тем самым предотвратив утечку Ваших данных.

Я не против поделиться некоторой статистической информацией, однако это не должны быть снимки моего Рабочего стола или веб-камеры и подобное. И при любых обстоятельствах, мне хотелось бы самостоятельно принимать решение отправлять ли какие-то статистические данные или нет. А так как в операционных системах по-умолчанию включены сбор и отправка Ваших данных и нет предложения выборочно отключить этот функционал, я буду солидарен с пользователями интернет, которые называют такие действия шпионскими.

На сегодняшний день уже многие сайты содержат новости об обновлениях KB3068708, KB3022345, KB3075249 и KB3080149, которые ставятся на Windows 7 или Windows 8.1. Эти обновления добавляют в такие операционные системы печально известный функционал, присутствующий в Windows 10.

Я предлагаю простой скрипт PowerShell, по сути блокирующий отправку на известные веб-адреса Ваших данных.

Write-Host -ForegroundColor DarkGray "START: Add spy URLs to the Hosts file"

$spyURLs = @(
"`n"
"`n"
"`n"
'# -----====== START BLOCK: Microsoft spy URLs disabling. Please visit http://Vam.in.UA ======-----'
'127.0.0.1 vortex-win.data.microsoft.com'
'127.0.0.1 settings-win.data.microsoft.com'
'127.0.0.1 vortex.data.microsoft.com'
'127.0.0.1 telecommand.telemetry.microsoft.com'
'127.0.0.1 telecommand.telemetry.microsoft.com.nsatc.net'
'127.0.0.1 oca.telemetry.microsoft.com'
'127.0.0.1 oca.telemetry.microsoft.com.nsatc.net'
'127.0.0.1 sqm.telemetry.microsoft.com'
'127.0.0.1 sqm.telemetry.microsoft.com.nsatc.net'
'127.0.0.1 watson.telemetry.microsoft.com'
'127.0.0.1 watson.telemetry.microsoft.com.nsatc.net'
'127.0.0.1 redir.metaservices.microsoft.com'
'127.0.0.1 choice.microsoft.com'
'127.0.0.1 choice.microsoft.com.nsatc.net'
'127.0.0.1 df.telemetry.microsoft.com'
'127.0.0.1 reports.wes.df.telemetry.microsoft.com'
'127.0.0.1 wes.df.telemetry.microsoft.com'
'127.0.0.1 services.wes.df.telemetry.microsoft.com'
'127.0.0.1 sqm.df.telemetry.microsoft.com'
'127.0.0.1 telemetry.microsoft.com'
'127.0.0.1 watson.ppe.telemetry.microsoft.com'
'127.0.0.1 telemetry.appex.bing.net'
'127.0.0.1 telemetry.urs.microsoft.com'
'127.0.0.1 telemetry.appex.bing.net'
'127.0.0.1 settings-sandbox.data.microsoft.com'
'127.0.0.1 vortex-sandbox.data.microsoft.com'
'127.0.0.1 survey.watson.microsoft.com'
'127.0.0.1 watson.live.com'
'127.0.0.1 watson.microsoft.com'
'127.0.0.1 statsfe2.ws.microsoft.com'
'127.0.0.1 corpext.msitadfs.glbdns2.microsoft.com'
'127.0.0.1 compatexchange.cloudapp.net'
'127.0.0.1 cs1.wpc.v0cdn.net'
'127.0.0.1 a-0001.a-msedge.net'
'127.0.0.1 statsfe2.update.microsoft.com.akadns.net'
'127.0.0.1 sls.update.microsoft.com.akadns.net'
'127.0.0.1 fe2.update.microsoft.com.akadns.net'
'127.0.0.1 diagnostics.support.microsoft.com'
'127.0.0.1 corp.sts.microsoft.com'
'127.0.0.1 statsfe1.ws.microsoft.com'
'127.0.0.1 pre.footprintpredict.com'
'127.0.0.1 i1.services.social.microsoft.com'
'127.0.0.1 i1.services.social.microsoft.com.nsatc.net'
'127.0.0.1 feedback.windows.com'
'127.0.0.1 feedback.microsoft-hohm.com'
'127.0.0.1 feedback.search.microsoft.com'
'127.0.0.1 rad.msn.com'
'127.0.0.1 preview.msn.com'
'127.0.0.1 ad.doubleclick.net'
'127.0.0.1 ads.msn.com'
'127.0.0.1 ads1.msads.net'
'127.0.0.1 ads1.msn.com'
'127.0.0.1 a.ads1.msn.com'
'127.0.0.1 a.ads2.msn.com'
'127.0.0.1 adnexus.net'
'127.0.0.1 adnxs.com'
'127.0.0.1 az361816.vo.msecnd.net'
'127.0.0.1 az512334.vo.msecnd.net'
'# -----====== END BLOCK: Microsoft spy URLs disabling. Please visit http://Vam.in.UA ======-----'
)

Out-File -FilePath "$env:SystemRoot\System32\drivers\etc\hosts" -InputObject $spyURLs -Force -Append -Encoding default