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

02.02.2014
Примечание. В этом проекте используется функция из заметки 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".

Kiosk mode computer
Окно 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"=""

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

Виталий Бочкарев