Компьютер в режиме терминала продаж

Примечание. В этом проекте используется функция из заметки WebSite - Подавление закрытия окна HTA.

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

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

Готовая инфраструктура:
- сервер 1С:Предприятие;
- компьютер для посетителей с "тонким" клиентом 1С;
- правильно разработанные формы 1С для учетной записи посетителя;
- доменная учетная запись для посетителей.

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

Чтобы сделать из рабочей станции терминал для самообслуживания (в моем случае терминал для ввода заказов в 1С), нужно по максимому ограничить функциональность компьютера и оставить только формы 1С. Это можно реализовать путем замены оболочки Windows на самописную форму. Я предлагаю использовать форму приложений HTA, в которой есть только 2 кнопки: Запустить 1С и перезагрузить компьютер, а также 1 скрытая функция (активируется нажатием CTRL+ENTER) - загрузить стандартный рабочий стол. Причем, чтобы запусить рабочий стол или перезагрузить компьютер, нужно ввести пароль (в моем случае пароль - MyPassword).

Ниже приведены листинги формы HTA-приложения, файла стилей CSS и файла скриптов VBS, которые можно набрать в обычном блокноте.

Листинг файла SelfServiceKiosk.hta:

<html>
  <head>
    <title>Self Service Kiosk</title>
    <hta:application
        id="oHTA" 
        ApplicationName = "SelfServiceKioskHTA" 
        Border = "Dialog"
        Caption = "Yes"
        ContextMenu = "No"
        InnerBorder = "No"
        MaximizeButton = "No"
        MinimizeButton = "No"
        Scroll = "No"
        Selection = "No"
        SingleInstance = "Yes"
        SysMenu = "No"
        WindowState = "normal"
        Version = "1.0"
    />
    <script src="SelfServiceKiosk.vbs" type="text/vbscript"></script>
    <link href="SelfServiceKiosk.css" rel="stylesheet" type="text/css" media="screen" />
  </head>
  <body onload="WindowOnLoad()" onkeypress="KeyPress(window.event)" onkeydown="KeyDown(window.event)"
    onbeforeunload="CloseHTA()" >
    <div class="Header_Row">
      <h1>Терминал самообслуживания</h1>
    </div>
    <div class="Content_Row">
      <input id="1CClient" type="button" value="1C клиент"
        onclick="RunApplication(me.id)" />
      <br />
      <input id="Reboot" type="button" value="Перезагрузка"
        onclick="RunApplication(me.id)" />
    </div>
    <div class="Footer_Row">
      <div id="Version_Div" style="float: left;">Версия: X.X</div>
    </div>
  </body>
</html>

Листинг файла SelfServiceKiosk.css:

body
{
  background-color: #E6B280;
  font-family: Tahoma;
}

table
{
  height: 100%;
  width: 100%;
}

.Header_Row
{
  height: 120px;
  text-align: center;
  color: black;
  margin: 0px 0px 0px 0px;
}

.Content_Row
{
  height: 100px;
  text-align: center;
}

.Content_Row input
{
  width: 300px;
  height: 30px;
  margin: 5px 2px 5px 2px;
}

.Footer_Row
{
  height:30px;
  font-size: 8pt;
}

#Version_Div
{
  float: left;
}

#Button_Div
{
  float: right;
}

Листинг файла SelfServiceKiosk.vbs:

Sub WindowOnLoad
    Dim CurrentResolution
    ' Размер окна
    iWidth = 400
    iHeight = 300
    ' Получение текущего разрешения экрана
    CurrentResolution = GetDisplayResolution()
    ' Изменение размера окна и его центрирование
    iLeft = (Split(CurrentResolution,";")(0) - iWidth) / 2
    iTop = (Split(CurrentResolution,";")(1) - iHeight) / 2
    Self.Focus()
    Self.resizeTo iWidth, iHeight
    Self.moveTo iLeft, iTop
    ' Вывод версии приложения на форму
    Version_Div.InnerHTML = "Версия: " & oHTA.Version
    ' Ожидание 5 секунд
    Call ccSleep(5)
    ' Запуск клиента 1С
    Call RunApplication("1CClient")
End Sub

Sub RunApplication(sApplication)
    sCommandLine =""
    Set oShell = CreateObject("Wscript.Shell")
    Select Case sApplication
        Case "1CClient"
            If CheckFile("C:\Program Files\1cv82\common\1cestart.exe") = True Then
                sCommandLine = """C:\Program Files\1cv82\common\1cestart.exe"""
            Else
                MsgBox("Файл не найден")
            End If
        Case "Explorer"
            If CheckFile("C:\Windows\explorer.exe") = True Then
                sCommandLine = "C:\Windows\explorer.exe"
            Else
                MsgBox("Файл не найден")
            End If
        Case "Reboot"
            If Inputbox("Введите пароль для перезагрузки рабочей станции", "Подтверждение перезагрузки", _
                        "Пароль нужно ввести здесь") = "MyPassword" Then
                sCommandLine = "Shutdown -r -f -t 0"
            Else
                MsgBox("Неверный пароль")
            End If
    End Select
    If Len(sCommandLine) > 0 Then oShell.Run sCommandLine,1,0
End Sub

Function ReadFile(sFileName)
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oInFile = oFSO.OpenTextFile(sFileName, 1, False, 0)
    sFileContent = oInFile.ReadAll
    oInFile.Close
    ReadFile = sFileContent
End Function

Function CheckFile(sFilePath)
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    If oFSO.FileExists(sFilePath) Then
        CheckFile = True
    Else
        CheckFile = false
    End if
End Function

Function GetDisplayResolution()
    Set oWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = oWMIService.ExecQuery("Select * From Win32_DesktopMonitor")
    For Each oItem In colItems
        iHorizontal = oItem.ScreenWidth
        iVertical = oItem.ScreenHeight
    Exit For
    Next
    GetDisplayResolution = iHorizontal & ";" & iVertical
End Function

Sub ccSleep(seconds)
    Set oShell = CreateObject("Wscript.Shell")
    sCommand = "%COMSPEC% /c ping -n " & 1 + seconds & " 127.0.0.1>nul"
    oShell.Run sCommand,0,1
End Sub

Function PingComputer(sComputer)
    Set oPing = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery( _
      "select * from Win32_PingStatus where address = '" & sComputer & "'")
    For Each oStatus In oPing
        If IsNull(oStatus.StatusCode) Or oStatus.StatusCode <> 0 Then 
            PingComputer = False
        Else
            PingComputer = True
        End If
    Next
End Function

Function KeyPress(mEvent)
  If (mEvent.ctrlKey And mEvent.keyCode = 10) Then
    If Inputbox("Введите пароль для отображения рабочего стола рабочей станции", _
                "Загрузка рабочего стола", "Пароль нужно ввести здесь") = "MyPassword" Then
      Call RunApplication("Explorer")
    Else
      MsgBox("Неверный пароль")
    End If
  End If
End Function

Function KeyDown(mEvent)
  if (mEvent.keyCode = 116 Or mEvent.keyCode =27 Or (mEvent.altKey and mEvent.keyCode=115)) Then
    window.event.returnValue = false
    window.event.keyCode = 0
  end If
End Function

Function CloseHTA
  
End Function

Все файлы нужно поместить в папку C:\Program Files\SelfServiceKiosk, а чтобы запустить приложение, нужно выполнить команду "C:\Windows\System32\mshta.exe" "%ProgramFiles%\SelfServiceKiosk\SelfServiceKiosk.hta".

kioskmodecomputer_01.png
Окно HTA-приложения для терминала самообслуживания

Как видно по рисунку, приложение очень простое. Оно выполняет следующие функции:
- автоматически запускает 1С клиент через 5 секунд после старта;
- позволяет посетителю запутить 1С клиент вручную, если предыдущий клиент закрыл окно 1С;
- не позволяет закрыть себя: не содержить кнопки "Закрыть" и подавляет нажатие ALT+F4;
- позволяет администратору перезагрузить компьютер, введя простой пароль;
- позволяет администратору загрузить обычный рабочий стол, введя простой пароль;

Когда приложение для замены стандартного рабочего стола готово и скопировано на компьютер, можно приступать к настройкам политики безопасности. Политики должны включать в себя следующие ограничения:
- замена рабочего стола приложением SelfServiceKiosk;
- меню CTRL+ATL+DEL - все запрещено, кроме смены пароля;
- диспетчер задач - запрещен;
- панель управления - запуск запрещен (если есть рабочий стол);
- меню пуск - изменение настроек запрещено (если есть рабочий стол);
- рабочий стол - изменение настроек запрещено (если есть рабочий стол);
- скринсейвер отключен;
- запрос пароля после засыпания компьютера - отключено;
- панель управления компьютером - запуск MMC запрещен

Политика безопасности наложена на контейнер, в котором находится служебный пользователь, используемый посетителями, причем фильтрация применения политики настроена только на этого служебного пользователя и не распространяется на другие службные учетные записи.

Листинг групповой политики:

Policies
  Administrative Templates
    Control Panel
      Prohibit access to the Control Panel: Enabled
    Control Panel/Add or Remove Programs
      Remove Add or Remove Programs: Enabled
    Control Panel/Personalization
      Enable screen saver: Disabled
      Password protect the screen saver: Disabled
      Prevent changing color scheme: Enabled
      Prevent changing desktop background: Enabled
      Prevent changing theme: Enabled
    Control Panel/Printers
      Prevent deletion of printers: Enabled
    Desktop
      Do not add shares of recently opened documents to Network Locations: Enabled
      Hide Network Locations icon on desktop: Enabled
      Prevent adding, dragging, dropping and closing the Taskbar's toolbars: Enabled
      Remove Properties from the Computer icon context menu: Enabled
    Start Menu and Taskbar
      Add Logoff to the Start Menu: Enabled
      Prevent changes to Taskbar and Start Menu Settings: Enabled
      Prevent grouping of taskbar items: Enabled
      Remove access to the context menus for the taskbar: Enabled
      Remove and prevent access to the Shut Down, Restart, Sleep, and Hibernate commands: Disabled
      Remove Clock from the system notification area: Disabled
      Remove drag-and-drop and context menus on the Start Menu: Enabled
      Remove Favorites menu from Start Menu: Enabled
      Remove links and access to Windows Update: Enabled
      Remove Logoff on the Start Menu: Disabled
      Remove Network Connections from Start Menu: Enabled
      Remove programs on Settings menu: Enabled
      Remove Recent Items menu from Start Menu: Enabled
      Remove Run menu from Start Menu: Enabled
      Remove Search link from Start Menu: Enabled
      Remove user folder link from Start Menu: Enabled
      Turn off personalized menus: Enabled
    System/Ctrl+Alt+Del Options
      Remove Lock Computer: Enabled
      Remove Logoff: Enabled
      Remove Task Manager: Enabled
    System/Power Management
      Prompt for password on resume from hibernate / suspend: Disabled
    Windows Components/Internet Explorer/Internet Control Panel
      Disable the Advanced page: Enabled
      Disable the Content page: Enabled
      Disable the Privacy page: Enabled
      Disable the Programs page: Enabled
    Windows Components/Microsoft Management Console/Restricted/Permitted snap-ins
      Computer Management: Disabled
    Windows Components/Windows Explorer
      Do not move deleted files to the Recycle Bin: Enabled
      Hides the Manage item on the Windows Explorer context menu: Enabled
      No Computers Near Me in Network Locations: Enabled
      Remove "Map Network Drive" and "Disconnect Network Drive": Enabled
      Remove Shared Documents from My Computer: Enabled
      Remove Windows Explorer's default context menu: Enabled
      Turn off Windows+X hotkeys: Enabled
  Preferences
    Windows Settings
      Registry
        Shell (Order: 1)
          General
            Action: Replace
          Properties
            Hive: HKEY_CURRENT_USER
            Key path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
            Value name: Shell
            Value type: REG_SZ
            Value data: "C:\Windows\System32\mshta.exe"
              "%ProgramFiles%\SelfServiceKiosk\SelfServiceKiosk.hta"
          Common
            Options
              Stop processing items on this extension if an error occurs on this item: No
              Run in logged-on user's security context (user policy option): No
              Remove this item when it is no longer applied: Yes

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

Листинг файла AutoLogonSet.reg:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
"AutoAdminLogon"="1"
"Defaultusername"="ServiceUser"
"DefaultDomainName"="MyDomain"
"DefaultPassword"="password"

Так как внести изменения в реестр может только администратор, то необходимо запустить полноценный рабочий стол (CTRL+ENTER), сменить пользователя на администратора и выпонить файл AutoLogonSet.reg (или просто выполнить файл от имени администратора в сессии служебного пользователя.

Если когда-то потребуется отменить автовход, то нужно очистить внесенные в реестр значения для автовхода.

Листинг файла AutoLogonReset.reg:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
"AutoAdminLogon"="0"
"Defaultusername"=""
"DefaultDomainName"=""
"DefaultPassword"=""

Терминал самообслуживания готов к работе.

Вверх