Рубрики
Без рубрики

Зафиксируйте окна с Python

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Почти четыре года назад мне поручено преобразовать Kixtart Сценарий к Python. Этот конкретный скрипт использовался для блокировки машин Windows XP, чтобы их можно было использовать в качестве киосков. Очевидно, вам не нужен python, чтобы сделать это. Любой язык программирования, который может получить доступ к реестру Windows, сможет сделать это или вы можете просто использовать групповые политики. Но это блог Python, так что это то, что вы собираетесь попасть в эту статью!

Начиная

Все, что вам нужно для этого учебника, это стандартное распределение Python и Pywin32 пакет Отказ Модули, которые мы будем использовать _winreg и подпрокат , которые встроены в стандартное распределение и Win32api и Win32Con от pywin32.

Мы посмотрим на код в двух половинах. Первая половина будет использовать _winreg Модуль:

import subprocess, win32con
from win32api import SetFileAttributes
from _winreg import *

# Note: 1 locks the machine, 0 opens the machine.      
UserPolicySetting = 1

# Connect to the correct Windows Registry key and path, then open the key
reg = ConnectRegistry(None, HKEY_CURRENT_USER)
regpath = r"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"
key = OpenKey(reg, regpath, 0, KEY_WRITE)

# Edit registry key by adding new values (Lock-down the PC)
SetValueEx(key, "NoRecentDocsMenu", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoRun", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoFavoritesMenu", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoFind", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoSetFolders", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoSetTaskbar", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoSetActiveDesktop", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoWindowsUpdate", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoSMHelp", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoCloseDragDropBands", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoActiveDesktopChanges", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoMovingBands", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoViewContextMenu", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoChangeStartMenu", 0, REG_DWORD, UserPolicySetting)
SetValueEx(key, "NoTrayContextMenu", 0, REG_DWORD, UserPolicySetting)
CloseKey(key)

Для начала мы импортируем модули, которые нам нужны. Затем мы подключаемся к реестру Windows и открываем следующую клавишу для записи:

HKEY_CURRENT_USER \ Программное обеспечение \ Microsoft \ Windows \ Centreversion \ Policies \ Explorer

Предупреждение. Перед продолжением следует отметить, что возиться с реестром Windows может привести к причинению вреда вашего компьютера, если вы сделаете это неправильно. Если вы не знаете, что вы делаете, создайте свой реестр, прежде чем делать что-либо или использовать виртуальную машину, которую вы можете восстановить (например, VirtualBox или VMware). Приведенный выше скрипт сделает ваш компьютер в основном непригодным для чего-либо, кроме киоска.

В любом случае, после открытия ключа, мы устанавливаем в десяток настроек, которые скрывают параметр «Запустить», «Избранные», «Последние» и «Найти» в меню «Пуск». Мы также отключаем правой кнопкой мыши на рабочем столе, обновлении Windows и все изменения в различных меню (среди прочего). Это все контролируется нашим UserPolysetting Переменная. Если он установлен на один (I.e. Boolean true), он заблокирует все эти значения; Если это равно нулю, то он снова включает все настройки. В конце мы называем Кличный ключ Чтобы применить настройки.

Мы должны остановиться здесь мгновение и полагать, что это какой-то действительно уродливый код (как указано в комментариях ниже). Я написал это, когда у меня был только месяц настолько опыта программирования, и я был портирован из сценария KixTart, который выглядел так же плохому или хужему, чем этот. Давайте попробуем сделать это очистителем:

from _winreg import *
        
UserPolicySetting = 1

# Connect to the correct Windows Registry key and path, then open the key
reg = ConnectRegistry(None, HKEY_CURRENT_USER)
regpath = r"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"
key = OpenKey(reg, regpath, 0, KEY_WRITE)

sub_keys = ["NoRecentDocsMenu", "NoRun", "NoFavoritesMenu",
            "NoFind", "NoSetFolders", "NoSetTaskbar",
            "NoSetActiveDesktop", "NoWindowsUpdate",
            "NoSMHelp", "NoCloseDragDropBands",
            "NoActiveDesktopChanges", "NoMovingBands",
            "NoViewContextMenu", "NoChangeStartMenu",
            "NoTrayContextMenu"]

# Edit registry key by adding new values (Lock-down the PC)
for sub_key in sub_keys:
    SetValueEx(key, sub_key, 0, REG_DWORD, UserPolicySetting)

CloseKey(key)

Основным отличием вот в том, что я взял все имена Sub_Key и поместите их в список Python, который мы можем повторить, установить каждый на правильное значение. Теперь, если у нас были несколько различий в этих строках кода, такие как смесь reg_dword и reg_sz, то нам нужно сделать что-то другое. Например, нам нужно будет повторять список кортежей вместо этого или, возможно, создать функцию для передачи информации. Если вы хотите наибольшую гибкость, вы можете создать класс, который делает это для вас в дополнение к передаче ошибок и открытия и закрытия клавиш. Я оставлю это как упражнение для читателя, хотя.

Другая половина нашего сценария будет скрывать различные значки и папки:

# Sets the "Hidden" attribute for specified files/folders.
if UserPolicySetting == 1:
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\Set Program Access and Defaults.lnk", win32con.FILE_ATTRIBUTE_HIDDEN)
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\Windows Catalog.lnk", win32con.FILE_ATTRIBUTE_HIDDEN)
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\Open Office Document.lnk", win32con.FILE_ATTRIBUTE_HIDDEN)
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\New Office Document.lnk", win32con.FILE_ATTRIBUTE_HIDDEN)
    # NOTE: Two backslashes are required before the last directory only
    subprocess.Popen('attrib +h "C:\Documents and Settings\All Users\Start Menu\Programs\\vnc"')
    subprocess.Popen('attrib +h "C:\Documents and Settings\All Users\Start Menu\Programs\\Outlook Express"')
    subprocess.Popen('attrib +h "C:\Documents and Settings\All Users\Start Menu\Programs\\Java Web Start"')
    subprocess.Popen('attrib +h "C:\Documents and Settings\All Users\Start Menu\Programs\\Microsoft Office"')
    subprocess.Popen('attrib +h "C:\Documents and Settings\All Users\Start Menu\Programs\\Microsoft SQL Server"')
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\Programs\Adobe Reader 6.0.lnk", win32con.FILE_ATTRIBUTE_HIDDEN)
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\Programs\Windows Media Player.lnk", win32con.FILE_ATTRIBUTE_HIDDEN)
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\Programs\Windows Movie Maker.lnk", win32con.FILE_ATTRIBUTE_HIDDEN)
else:
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\Set Program Access and Defaults.lnk", win32con.FILE_ATTRIBUTE_NORMAL)
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\Windows Catalog.lnk", win32con.FILE_ATTRIBUTE_NORMAL)
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\Open Office Document.lnk", win32con.FILE_ATTRIBUTE_NORMAL)
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\New Office Document.lnk", win32con.FILE_ATTRIBUTE_NORMAL)
    subprocess.Popen('attrib -h "C:\Documents and Settings\All Users\Start Menu\Programs\\vnc"')
    subprocess.Popen('attrib -h "C:\Documents and Settings\All Users\Start Menu\Programs\\Outlook Express"')
    subprocess.Popen('attrib -h "C:\Documents and Settings\All Users\Start Menu\Programs\\Java Web Start"')
    subprocess.Popen('attrib -h "C:\Documents and Settings\All Users\Start Menu\Programs\\Microsoft Office"')
    subprocess.Popen('attrib -h "C:\Documents and Settings\All Users\Start Menu\Programs\\Microsoft SQL Server"')
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\Programs\Adobe Reader 6.0.lnk", win32con.FILE_ATTRIBUTE_NORMAL)
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\Programs\Windows Media Player.lnk", win32con.FILE_ATTRIBUTE_NORMAL)
    SetFileAttributes("C:\Documents and Settings\All Users\Start Menu\Programs\Windows Movie Maker.lnk", win32con.FILE_ATTRIBUTE_NORMAL)

Этот фрагмент скрывает следующее

  • Различные ссылки на документы Microsoft Office, которые обычно отображаются в меню «Пуск»
  • Каталог Windows и заданный программный доступ и ярлыки по умолчанию
  • Различные папки в меню «Пуск» в подменю меню «Пуск» мы не хотим доступа пользователя, например VNC, Office, Microsoft SQL Connector и т. Д.
  • Другие ссылки в подменю программ

Это достигается благодаря комбинации SetFileattributes win32api и атрибутов файлов win32con для ярлыков. Скрытый статус папки переключается с помощью призыва подпроцессы к Windows Команда aptry Отказ

К сожалению, это еще один пример повторяющегося кода. Давайте найдя немного и попытаемся ревертировать это. Похоже, что все, что мы устанавливаем, находится в меню «Пуск» или подпапки его программ. Мы, вероятно, можем взять эти пути и поставить их в петлю, как мы сделали с предыдущим примером. Мы также можем использовать флаг, чтобы сказать нам, когда скрывать или показать папки. Мы приложим все это в функцию, чтобы облегчить повторное использование тоже. Давайте посмотрим, как это выглядит:

import os
import subprocess
import win32con
from win32api import SetFileAttributes

def toggleStartItems(flag=True):
    items = ["Set Program Access and Defaults.lnk", "Windows Catalog.lnk",
             "Open Office Document.lnk", "New Office Document.lnk",
             "Programs\Adobe Reader 6.0.lnk", "Programs\Windows Media Player.lnk",
             "Programs\Windows Movie Maker.lnk", "Programs\\vnc",
             "Programs\\Outlook Express", "Programs\\Java Web Start",
             "Programs\\Microsoft Office", "Programs\\Microsoft SQL Server"]
    path = r'C:\Documents and Settings\All Users\Start Menu'
    if flag:
        toggle = "+h"
    else:
        toggle = "-h"
        
    for item in items:
        p = os.path.join(path, item)
        if os.path.isdir(p):
            subprocess.Popen('attrib %s "%s"' % (toggle, p))
        elif flag:
            SetFileAttributes(p, win32con.FILE_ATTRIBUTE_HIDDEN)
        else:
            SetFileAttributes(p, win32con.FILE_ATTRIBUTE_NORMAL)

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

Обертывание

Теперь вы знаете, как создать киоск своих собственных с Windows и Python. Я надеюсь, что вы нашли эту статью полезную.

Примечание. Эти скрипты испытываются с помощью Python 2.4+ на Windows XP

Дальнейшее чтение