Автор Тема: [РЕШЕНО] На пользователе не отрабатывают логон скрипты  (Прочитано 1684 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн sirarthur

  • Старожил
  • ****
  • Сообщений: 577
  • Рейтинг: 5
  • Пол: Мужской
    • Просмотр профиля
Политиками маппируются сетевые ресурсы - на основании принадлежности в группе.
Скрипты работают у всех за исключением одного пользователя (секретарь ВИПов).
Берем проблемную учетку - логинимся с любой другой машины в домене - получаем точно такую же ошибку.
Ошибка выдается на таком шаге скрипта:
'FinDept
'
'Поиск пользователя по  DistingishedName и поиск по группам в которых он состоит
'Получаем fqdn домена
Set oRoot = GetObject("LDAP://rootDSE")
Set oDomain = GetObject("LDAP://" & oRoot.Get("defaultNamingContext"))
fqDomain = oRoot.Get("defaultNamingContext")

'Получаем netbios username, computername и domainname
Set objNetwork = CreateObject("Wscript.Network")
currentDomain = objNetwork.UserDomain
currentUser = objNetwork.UserName
strComputerName = objNetwork.ComputerName
uCN = findDN
GRP = "T-RO" 'Переменная искомой группы'
Set objUser = GetObject("LDAP://" & uCN) 'Делаем поиск по ЛДАП'  - выдает ошибку в этой строке
If IsMember(GRP) Then
 CheckAndMountDrive()
End If
ClearAll()
Wscript.Quit
Пересоздавать учетку крайне не хочется - из-за проблем с кэшем exchange
Что еще может быть?
« Последнее редактирование: 06 марта 2017, 14:29:16 от sirarthur »

Оффлайн shs

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 4401
  • Рейтинг: 89
    • Просмотр профиля
    • ShS's blog
  • Откуда: Default city
Профиль у проблемной учетки перемещаемый?

Оффлайн sirarthur

  • Старожил
  • ****
  • Сообщений: 577
  • Рейтинг: 5
  • Пол: Мужской
    • Просмотр профиля
нет. перемещаемые профили не используются.
т.е при логине с другой машины профиль создается новый


Updated: 06 March 2017, 10:26:58

и ошибка только у одного пользователя

Оффлайн shs

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 4401
  • Рейтинг: 89
    • Просмотр профиля
    • ShS's blog
  • Откуда: Default city
Странно. А если скрипт запустить руками в контексте проблемного пользователя, то он отработает?

Оффлайн sirarthur

  • Старожил
  • ****
  • Сообщений: 577
  • Рейтинг: 5
  • Пол: Мужской
    • Просмотр профиля
залогинился под пользователем.
Скопировал текст скрипта на машину -запустил руками- получил ошибку


Updated: 06 March 2017, 11:47:40

Вот полный текст скрипта:
'FinDept

'
'----------------------
'
'Поиск пользователя по  DistingishedName и поиск по группам в которых он состоит

'Получаем fqdn домена
Set oRoot = GetObject("LDAP://rootDSE")
Set oDomain = GetObject("LDAP://" & oRoot.Get("defaultNamingContext"))
fqDomain = oRoot.Get("defaultNamingContext")

'Получаем netbios username, computername и domainname
Set objNetwork = CreateObject("Wscript.Network")
currentDomain = objNetwork.UserDomain
currentUser = objNetwork.UserName
strComputerName = objNetwork.ComputerName
uCN = findDN
GRP = "T-RO" 'Переменная искомой группы'
Set objUser = GetObject("LDAP://" & uCN) 'Делаем поиск по ЛДАП'
If IsMember(GRP) Then
 CheckAndMountDrive()
End If
ClearAll()
Wscript.Quit
'-----------Функции
Function ClearAll()
 Set oWN = Nothing
 Set objNetwork = Nothing
 Set oFSO = Nothing
 Set oRoot = Nothing
 Set oDomain = Nothing
 Set Wshshell = Nothing
Set PPshortcut = Nothing
End Function

Function CheckAndMountDrive() 'Проверка на наличие сетевого диска'
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oWN = CreateObject("WScript.Network")
'// This makes sure the drive is not there
If Not oFSO.DriveExists("N:") Then
'// Map the drive
oWN.MapNetworkDrive "T:", "\\msrv\MD"
    Create ()
'msgbox "Drive L is mounted"
'
'wscript.Echo (strComputerName & "," & currentUser )
'Create ()
    SendMail strComputerName, currentUser
End If
 '// Clean up
' Set oWN = Nothing
 'Set oFSO = Nothing

End Function


Function Create ()
Dim  Wshshell,Wshfldr,PPshortcut,Desktopfldr

Set Wshshell = WScript.CreateObject("WScript.Shell")
Set Wshfldr = Wshshell.SpecialFolders
Desktopfldr = Wshfldr("Desktop")

Set PPshortcut = Wshshell.CreateShortcut(Desktopfldr & "\Диск T.lnk")
 
PPshortcut.TargetPath = Wshshell.ExpandEnvironmentStrings ("T:\")
PPshortcut.WorkingDirectory = WshShell.ExpandEnvironmentStrings ("T:\")
PPshortcut.WindowStyle = 4
PPshortcut.IconLocation = WSHShell.ExpandEnvironmentStrings ("T:\, 0")
PPshortcut.Save

' SendMail strComputerName, currentUser

End Function

Private Sub SendMail(strComputerName, currentUser)
MailServer = "***********"
MailPort = "25"
sender = "NetworkDriveMapper@**************"
recipient = "*****************"
strMsgBody = "Пользователь " & currentUser & " находится в группе " & GRP & "." & vbCrlf _
 & "Диск N смонтирован на компьютере " & strComputerName _
 & " ярлык  - Drive N.lnk создан."
'wscript.Echo strComputerName
Set objEmail = CreateObject("CDO.Message")
objEmail.From = sender
objEmail.To = recipient
objEmail.Subject = "Монтирование диска T выполнено"
objEmail.Textbody = strMsgBody
objEmail.BodyPart.CharSet = "windows-1251"

objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = MailServer
objEmail.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = MailPort
objEmail.Configuration.Fields.Update
objEmail.Send
'Wscript.Echo "Send"
'Wscript.quit

End Sub

Function IsMember(grpName) 'А был ли мальчик?

If IsEmpty(grpList) Then
Set grpList = CreateObject("Scripting.Dictionary")
grpList.CompareMode = TextCompare

Set colGroups = objUser.Groups
For Each objGroup in colGroups
If NOT CBool(grpList.Exists(objGroup.CN)) Then
grpList.Add objGroup.CN, "-"
GetNested(objGroup)
End If
Next
End If
IsMember = CBool(grpList.Exists(grpName))
End Function

Function GetNested(objGroup) 'Определение членства

On Error Resume Next
colMembers = objGroup.GetEx("memberOf")
For Each strMember in colMembers
If NOT strMember = "" Then
strPath = "LDAP://" & strMember
Set objNestedGroup = GetObject(strPath)
If NOT CBool(grpList.Exists(objNestedGroup.CN)) Then
grpList.Add objNestedGroup.CN, "-"
GetNested(objNestedGroup)
End If

End If

Next

End Function


Function findDN 'Поиск DistinguishedName используя sAMAccountName

Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"

Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
objCommand.CommandText = _
"<LDAP://" & fqDomain & ">;(&(objectCategory=" & "User" & ")" & _
"(samAccountName=" & currentUser & "));samAccountName,distinguishedName;subtree"
Set objRecordSet = objCommand.Execute

If objRecordset.RecordCount = 0 Then
WScript.Quit(0)
Else
findDN = objRecordSet.Fields("distinguishedName").Value
objConnection.Close
End If

End Function
« Последнее редактирование: 06 марта 2017, 11:48:46 от sirarthur »

Оффлайн shs

  • Модератор
  • Ветеран
  • *****
  • Сообщений: 4401
  • Рейтинг: 89
    • Просмотр профиля
    • ShS's blog
  • Откуда: Default city
Т.е. ошибка в строке 20
Set objUser = GetObject("LDAP://" & uCN) 'Делаем поиск по ЛДАП'
Хотелось бы увидеть содержимое uCN на момент выполнения


А посмотри на проблемной машине результат выполнения след. команды:
net helpmsg 20480

Оффлайн sirarthur

  • Старожил
  • ****
  • Сообщений: 577
  • Рейтинг: 5
  • Пол: Мужской
    • Просмотр профиля
Короче разобрались.
Причина крылась в исковерканном по желанию випов CN, а именно CN  собой констуркцию вида:
CN=PA for VIP/ Аьбыр валг,ou=1,dc=domain,dc=loc
Чему нас учит, как говорится семья и школа МС:
Цитировать
The following characters are not allowed in sAMAccountName's:

" [ ] : ; | = + * ? < > / \ ,

All of these characters are allowed in Distinguished Names, but the last three must be escaped.
Поэтому если нельзя но, а куда деваться очень хочется:
uCN = findDN
GRP = "T-RO" 'Переменная искомой группы'
uCN=Replace(uCN, "/", "\/")
Set objUser = GetObject("LDAP://" & uCN) 'Делаем поиск по ЛДАП'

« Последнее редактирование: 06 марта 2017, 14:36:20 от sirarthur »