IliaKot
Newbie | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору '************************************************************ ' Объявление переменных '************************************************************ Dim WshShell, WshNetwork,Level,dic Dim strUserDN, objSysInfo, GroupObj, UserGroups, UserObj Dim line set dic = createobject("Scripting.Dictionary") '************************************************************ ' Внутренние функции '************************************************************ On Error Resume Next Function MapDrv(DrvLet, UNCPath) Dim WshNetwork Dim Msg On Error Resume Next Set WshNetwork = WScript.CreateObject("WScript.Network") WshNetwork.RemoveNetworkDrive DrvLet WshNetwork.MapNetworkDrive DrvLet, UNCPath Select Case Err.Number Case 0 Case -2147023694 WshNetwork.RemoveNetworkDrive DrvLet WshNetwork.MapNetworkDrive DrvLet, UNCPath Case -2147024811 WshNetwork.RemoveNetworkDrive DrvLet WshNetwork.MapNetworkDrive DrvLet, UNCPath End Select End Function '***************************************************************** ' Словарь '***************************************************************** function dictionary set dic = createobject("Scripting.Dictionary") Level=0 Set objSysInfo = CreateObject("ADSystemInfo") Set objUser = GetObject ("LDAP://" & objSysInfo.UserName) arrMembersOf = objUser.GetEx("memberof") if Err.Number = 0 then GroupBelong(arrMembersOf) end function '***************************************************************** ' Рекурсия '***************************************************************** function GroupBelong(arrMembers) On Error Resume Next For each Group in arrMembers Set objGroup = GetObject ("LDAP://" & Group) objGroup.GetInfo dic.add lcase(objGroup.Get("cn")),lcase(objGroup.Get("cn")) arrMembersSub = objGroup.Getex("memberof") if Err.Number = 0 then GroupBelong(arrMembersSub) Err.Number = 0 Next Level=Level+1 if Level=50 then WScript.echo "Достигнут максимальный уровень вложенности" exit function end if End function '*************************************************************** ' Получение Primary Group пользователя '*************************************************************** 'WScript.Echo "Current User Name: " & CurrentUserName() 'WScript.Echo "Current User ADsPath: " & ADsPathUser(CurrentUserName()) 'WScript.Echo "Primary Group:" 'WScript.Echo GetPrimaryGroup(ADsPathUser(CurrentUserName())) ' Возвращает "SAMAccountName" текущего пользователя Function CurrentUserName() Set WshNetwork = WScript.CreateObject("WScript.Network") CurrentUserName = WshNetwork.UserName Set WshNetwork = Nothing End Function ' Возвращает "ADsPath" по "SAMAccountName" пользователя Function ADsPathUser(UserName) Set RootDSE = GetObject("LDAP://RootDSE") Set Connection = CreateObject("ADODB.Connection") Connection.Provider = "ADSDSOObject" Connection.Open "ADs Provider" Set Command = CreateObject("ADODB.Command") Set Command.ActiveConnection = Connection CommandString = "<" & "LDAP://" & RootDSE.Get("defaultNamingContext") & ">" & ";" & "(&(objectCategory=Person)(objectClass=User)(SAMAccountName=" & UserName & "))" & ";" & "ADsPath" & ";" & "Subtree" Command.CommandText = CommandString Command.Properties("Page Size") = 1000 Command.Properties("Size Limit") = 1 Command.Properties("Timeout") = 30 Set RecordSet = Command.Execute ADsPathUser = RecordSet.Fields("ADsPath").Value RecordSet.Close Connection.Close Set RecordSet = Nothing Set Command = Nothing Set Connection = Nothing Set RootDSE = Nothing End Function ' Возвращает "primaryGroupID" по "ADsPath" Function IADsprimaryGroupID(ADsPath) Set Object = GetObject(ADsPath) IADsprimaryGroupID = Object.primaryGroupID End Function ' Возвращает имя "Primary Group" по "ADsPath" Function GetPrimaryGroup(ADsPath) Set RootDSE = GetObject("LDAP://RootDSE") Set Connection = CreateObject("ADODB.Connection") Connection.Provider = "ADSDSOObject" Connection.Open "ADs Provider" Set Command = CreateObject("ADODB.Command") Set Command.ActiveConnection = Connection CommandString = "<" & "LDAP://" & RootDSE.Get("defaultNamingContext") & ">" & ";" & "(objectCategory=Group);distinguishedName,primaryGroupToken;subtree" Command.CommandText = CommandString 'Command.Properties("Page Size") = 1000 'Command.Properties("Size Limit") = 1 'Command.Properties("Timeout") = 30 Set RecordSet = Command.Execute If Err.Number <> 0 Then WSCript.Echo "При поиске Primary Group произошла ошибка: " & Err.Description & "[" & Err.Number & "]" End If While Not Recordset.EOF If Recordset.Fields("primaryGroupToken").Value = IADsprimaryGroupID(ADsPath) Then GetPrimaryGroup = Recordset.Fields("distinguishedName").Value End If Recordset.MoveNext Wend RecordSet.Close Connection.Close Set RecordSet = Nothing Set Command = Nothing Set Connection = Nothing Set RootDSE = Nothing End Function '************************************************************ ' Процедуры вызываемая из wsf файла. '************************************************************ function mpd(grp,share,letter) if lcase(grp)="everyone" then mapdrv letter,share if dic.count=0 then dictionary if dic.item(lcase(grp))=lcase(grp) then mapdrv letter,share exit function end if End function function mpd_user(user,share,letter) Set WshNetwork = WScript.CreateObject("WScript.Network") if lcase(user)=lcase(WshNetwork.UserName) then mapdrv letter,share exit function end if end function '************************************************************* ' Конец скрипта '************************************************************* '************************************************************* ' Блок который заполняют ' "Администраторы" на местах '************************************************************* <job> <script language = "VBScript" SRC= "logon.vbs"/> <script language = "vbscript"> '************************************************************* ' Скрипт подключения сетевых дисков пользователю на основе ' принадлежности пользователя к группам ' ' Необходимо корректно заполнить строку вызова внешней процедуры: ' mpd "_наименование группы в AD_","_Путь к шаре(ресурсу)_","_Буква диска_" ' Наименование группы, путь к шаре и буква диска пишутся в кавычках через запятую, скобки не нужны ' Наименование группы пишется так же как оно записано в AD без учёта регистра. ' ' Примеры: ' mpd "domain users","\\server\netlogon","z:" - Правильное написание будет работать ' mpd "Domain Users","\\server\netlogon","z:" - Правильное написание будет работать ' mpd ("Domain Users","\\server\netlogon","z:") - Не будет работать ' mpd "domain users","\\server\function\","x:" - Не будет работать ' mpd "domain users","\\server\refbook","w:\" - Не будет работать ' ' '************************************************************* mpd "domain admins","\\server\install","q:" '************************************************************* </script> </job> | Всего записей: 2 | Зарегистр. 22-02-2006 | Отправлено: 15:54 22-02-2006 | Исправлено: IliaKot, 16:05 22-02-2006 |
|