Распространение nethasp.ini групповыми политиками

Автоматизируем указание конкретного HASP LM пользовательским компьютерам при помощи GPO.

Как известно, несколько одноранговых 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 правами.

Что делает скрипт — да очень просто:

  1. проверяет членство компьютера в группе NH_managed, если не член — то ничего не делает
  2. проверяет членство компьютера в группах  NH_server1 и NH_server2, если член — пишет им в nethasp.ini соответствующий адрес HASP LM, если же нет — то 127.0.0.1, чтобы вообще к хаспам не лезли.
  3. если же проверить членство в группах не удалось (к примеру, недоступен контроллер домена) — ничего не меняет.

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

 

 

5 Comments

  1. bird21

    Любопытно, надо попробовать.

    Reply
  2. LynxX

    Спасибо, как раз сейчас решаем проблему.

    Reply
  3. juker

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

    Reply
  4. asved.ru

    (3) juker, можно попробовать раздавать разные бинарники — а nethasp.ini класть в inconf

    Reply
  5. Vlad87

    Не могу отправить Вам лс. Можете скинуть контакты на hygienesss at gmail.com? Пожалуйста, вопрос на минуту. Извините за офтоп.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *