У меня следующая проблема:
Когда я запускаю свой LOGON_SCRIPT.vbs для добавления общих сетевых ресурсов пользователям определенной группы, он пропускает первый, если пользователь является частью Kleinkunstig_Users (он не добавит первый общий ресурс). Но если я добавлю еще одну группу, она добавит долю первой и второй. Пожалуйста помоги? (сценарий ниже)
'start script
On Error Resume Next
Set objSysInfo = CreateObject("ADSystemInfo")
Set objNetwork = CreateObject("Wscript.Network")
'find user name
strUserPath = "LDAP://" & objSysInfo.UserName
Set objUser = GetObject(strUserPath)
'find user group's
For Each strGroup in objUser.MemberOf
strGroupPath = "LDAP://" & strGroup
Set objGroup = GetObject(strGroupPath)
strGroupName = objGroup.CN
' if user member of a group then map network drive
Select Case strGroupName
'
Case "Kleinkunstig_Users"
objNetwork.MapNetworkDrive "Y:", "\\KL01\Kleinkunstig"
Case "Kleinkunstig_Sales"
objNetwork.MapNetworkDrive "V:", "\\KL01\Sales"
Case "Kleinkunstig_Marketing"
objNetwork.MapNetworkDrive "M:", "\\KL01\Marketing"
Case "Kleinkunstig_Maanagement"
objNetwork.MapNetworkDrive "X:", "\\KL01\Management"
Case "Kleinkunstig_IT"
objNetwork.MapNetworkDrive "I:", "\\KL01\IT"
Case "Kleinkunstig_Financial"
objNetwork.MapNetworkDrive "O:", "\\KL01\Financial"
Case "Kleinkunstig_Administrator"
objNetwork.MapNetworkDrive "Q:", "\\KL01\Administrators"
'
End Select
Next
'end script
В следующем коде MemberOf может возвращать либо коллекцию, либо строковое значение (если пользователь является членом только одной группы в дополнение к своей основной группе):
For Each strGroup in objUser.MemberOf
Вы не можете «Для каждого» использовать objUser.MemberOf, если objUser.MemberOf является строкой.
Вероятно, это ошибка, которую вы не видите из-за следующей строки:
On Error Resume Next
(обратите внимание, что удаление этой строки из сценария, который выполняют многие пользователи, может означать, что все они начнут получать ошибки при входе в систему)
Один очень грязный способ тестирования и исправления этого - добавить пользователей, о которых идет речь, в «фиктивную» дополнительную группу. Это должно заставить значение, возвращаемое MemberOf, быть коллекцией, которую вы затем можете перечислить с помощью For Each.
Я добился успеха со сценарием, аналогичным приведенному в этом ответе: Автоматически запускать скрипт при входе в Windows, цитируется здесь:
Const ENGINEERING_GROUP = "cn=engineering"
Const FINANCE_GROUP = "cn=finance"
Const HUMAN_RESOURCES_GROUP = "cn=human resources"
Set wshNetwork = CreateObject("WScript.Network")
wshNetwork.MapNetworkDrive "h:",
"\\FileServer\Users\" & wshNetwork.UserName
Set ADSysInfo = CreateObject("ADSystemInfo")
Set CurrentUser = GetObject("LDAP://" &
ADSysInfo.UserName)
strGroups = LCase(Join(CurrentUser.MemberOf))
If InStr(strGroups, ENGINEERING_GROUP) Then
wshNetwork.MapNetworkDrive "g:",
"\\FileServer\Engineering\"
wshNetwork.AddWindowsPrinterConnection
"\\PrintServer\EngLaser"
wshNetwork.AddWindowsPrinterConnection
"\\PrintServer\Plotter"
wshNetWork.SetDefaultPrinter
"\\PrintServer\EngLaser"
ElseIf InStr(strGroups, FINANCE_GROUP) Then
wshNetwork.MapNetworkDrive "g:",
"\\FileServer\Finance\"
wshNetwork.AddWindowsPrinterConnection
"\\PrintServer\FinLaser"
wshNetWork.SetDefaultPrinter
"\\PrintServer\FinLaser"
ElseIf InStr(strGroups, HUMAN_RESOURCES_GROUP) Then
wshNetwork.MapNetworkDrive "g:",
"\\FileServer\Human Resources\"
wshNetwork.AddWindowsPrinterConnection
"\\PrintServer\HrLaser"
wshNetWork.SetDefaultPrinter
"\\PrintServer\HrLaser"
End If
Теоретически описанный выше подход может вызвать проблемы, если одно из названий вашей группы является подстрокой другого, например «финансы» и «финансы и аудит».
Существует множество других возможных подходов, включая тестирование значения, возвращаемого функцией MemberOf, чтобы определить, является ли оно строкой или массивом.
Возможная альтернатива использованию сценария входа в систему для сопоставления сетевых дисков (может потребоваться более поздняя версия сервера / клиента, чем у вас сейчас):
Удачи!