Самообслуживание - концепция в торговле, при которой приобретение товаров и услуг производится покупателем самостоятельно, без помощи обслуживающего персонала. Типичный пример терминала самообслуживания - это банкомат.
В этой статье я расскажу, как сделать самый простой терминал самообслуживания для своих клиентов, базируясь на обычной рабочей станции.
Готовая инфраструктура:
- сервер 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".
Окно 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"=""
Терминал самообслуживания готов к работе.