Как известно, несколько одноранговых HASP ключей совместно не работают. Точнее, работают, но плохо.
Проблема заключается в том, что клиент, не сумев получить лицензию с одного из ключей по причине его исчерпания, с другого ключа того же ранга пытаться получить лицензию не будет. Это by design и не лечится.
Существует метод обхода этой проблемы: требуется установить ключи и менеджеры лицензий на различные серверы и каждому компьютеру указать свой адрес HASP LM, иными словами — вручную распределить компьютеры по менеджерам лицензий, отредактировав nethasp.ini на каждом компьютере.
А поскольку мы с вами люди ленивые и к каждому компьютеру ходить не желаем, мы воспользуемся возможностями групповых политик Active Directory: установим startup script, который сам напишет в nethasp.ini все, что нам нужно, при включении компьютера.
В качестве критерия развертывания будем использовать членство компьютера в группах: создадим в AD группу с наименованием «NH_managed» — в нее мы будем включать все компьютеры, содержимим nethasp.ini которых мы будем управлять, и группы распределения по HASP LM — назовем их NH_server1 и NH_server2 — по ним мы будем распределять клиентские компьютеры.
После этого нам останется только создать либо выбрать подходящий существующий GPO (объект групповой политики) и установить в нем в качестве startup-скрипта наш скрипт.
Обратите внимание: startup-скрипт устанавливается в политике компьютера и действует только на компьютеры, следовательно, управляемые компьютеры должны находиться в OU (подразделениях), попадающих под действие нашего GPO.
Logon же скриптом, отрабатывающим при входе пользователя, воспользоваться без потенциально небезопасных ухищрений не удастся — logon-скрипт исполняется в контексте пользователя, а у нормального администратора пользователи не располагают требуемыми для записи nethasp.ini правами.
Что делает скрипт — да очень просто:
- проверяет членство компьютера в группе NH_managed, если не член — то ничего не делает
- проверяет членство компьютера в группах NH_server1 и NH_server2, если член — пишет им в nethasp.ini соответствующий адрес HASP LM, если же нет — то 127.0.0.1, чтобы вообще к хаспам не лезли.
- если же проверить членство в группах не удалось (к примеру, недоступен контроллер домена) — ничего не меняет.
P.S. Если у Вас нет AD, или Вы не умеете с AD работать — сочувствую, придется либо учиться, либо админить ногами.
А вот и наш скрипт, в нем следует лишь указать реальные адреса HASP LM
'==========================================================================
' VBScript Source File -- Set nethasp.ini on computer group membership
'
' Please set your group names and NH server addresses at GetNHaddrByGroup() definition section
'
'==========================================================================
Option Explicit
Dim NH_address
NH_address = GetNHaddrByGroup()
If NH_address = "" Then
Else
CreateNHINI(NH_address)
End If
Function GetNHaddrByGroup()
On Error Resume Next
Dim wshNetwork, ADSysInfo, CurrentHost, StrGroups, NHaddr
Dim addr1, addr2, addrNull, group1, group2
NHaddr = ""
'=============================================
' set addresses and group names here:
group1 = "NH_server1"
addr1 = "192.168.0.2"
group2 = "NH_server2"
addr2 = "192.168.0.7"
' addrNull writes to nethasp.ini if the computer is not member of group1 or group2,
' but is member of "NH_managed" group
addrNull = "127.0.0.1"
'=============================================
Set ADSysInfo = CreateObject("ADSystemInfo")
If ADSysInfo.ComputerName = "" Then
GetNHaddrByGroup = ""
Exit Function
Else
Set CurrentHost = GetObject("LDAP://" & ADSysInfo.ComputerName)
End If
StrGroups = Join(CurrentHost.MemberOf)
If InStr(StrGroups, "NH_managed") Then
If InStr(StrGroups, group1) Then
NHaddr = addr1
Else
If InStr(StrGroups, group2) Then
NHaddr = addr2
Else
NHaddr = addrNull
End If
End If
End If
GetNHaddrByGroup = NHaddr
End Function
Function CreateNHINI(nhserveraddr)
Dim filepath
Dim ofile, objFSO
filepath = GetNHPath()
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set ofile = objFSO.CreateTextFile(filepath)
ofile.WriteLine "[NH_COMMON]"
ofile.WriteLine "NH_IPX = Disabled"
ofile.WriteLine "NH_NETBIOS = Disabled"
ofile.WriteLine "NH_TCPIP = Enabled"
ofile.WriteLine "[NH_IPX]"
ofile.WriteLine "[NH_NETBIOS]"
ofile.WriteLine "[NH_TCPIP]"
ofile.WriteLine "NH_SERVER_ADDR = " & nhserveraddr
ofile.WriteLine "NH_PORT_NUMBER = 475"
ofile.WriteLine "NH_TCPIP_METHOD = UDP"
ofile.WriteLine "NH_USE_BROADCAST = Disabled"
ofile.WriteLine ""
ofile.Close
End Function
Function GetNHPath()
Dim WshShell, ProgramFilesPath, ProgramFilesx86Path
Set WshShell = CreateObject("WScript.Shell")
ProgramFilesPath = WshShell.ExpandEnvironmentStrings("%PROGRAMFILES%")
ProgramFilesx86Path = WshShell.ExpandEnvironmentStrings("%PROGRAMFILES(x86)%")
If ProgramFilesx86Path = "%PROGRAMFILES(x86)%" Then
' it's x32 OS, all OK
Else
ProgramFilesPath = ProgramFilesx86Path
End if
GetNHPath = ProgramFilesPath&"1cv82conf
ethasp.ini"
End Function
Любопытно, надо попробовать.
Спасибо, как раз сейчас решаем проблему.
К сожалению, в терминальных сессиях это не подойдет. Клиентом используются серверные бинарники без локальной установки.
(3) juker, можно попробовать раздавать разные бинарники — а nethasp.ini класть в inconf
Не могу отправить Вам лс. Можете скинуть контакты на hygienesss at gmail.com? Пожалуйста, вопрос на минуту. Извините за офтоп.