Подключение сетевых дисков
Наверное, самый часто используемый скрипт в жизни системного администратора — скрипт, подключающий сетевые диски пользователям. На просторах Интернета их великое множество, но периодически они не подходят под требования. У меня как раз возник такой случай и пришлось написать свой.
Скрипт был необходим для одной специализированной программы, которая использует как общие диски для всех пользователей, так и персональные для каждого, причем персональные диски называются по собственному алгоритму программы и как-то объединить их вроде \\server\%username% — нельзя.
Подключать диски через Group Policy Preferences тоже нельзя, т.к. добавлять/удалять/изменять набор сетевых дисков (например при появлении нового сотрудника) должен низкоквалифицированный персонал, которому делать это в оснастке gpmc.msc будет сложновато.
В итоге я решил сделать текстовый файл с конфигурацией сетевых дисков, дать на него права на редактирование нужным сотрудникам и обрабатывать его скриптом.
Еще немаловажным минусом во всех скриптах является отсутствие логов. В моем скрипте все пишется в лог подробно-преподробно.
Итак скрипт.
'==========================================================================
' VBScript Source File
'
' NAME: Logon script for connect network drives which used by SunSystem and Q&A
'
' AUTHOR: Yakov Barinov
' DATE : 20.01.2011
'
' COMMENT:
'==========================================================================
'On Error Resume Next
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objNetwork = WScript.CreateObject("WScript.Network")
Set WSHShell = Wscript.CreateObject("WScript.Shell")
Set objArgs = WScript.Arguments
Dim strShareFilePath, objTS
Dim LogFile, LogEnabled, SilentMode
Dim strDomain, strUserName, strComputerName
strComputerName = objNetwork.ComputerName
strDomain = objNetwork.UserDomain
strUserName = objNetwork.UserName
LogFile = "\\domen.ru\dfs\Logs\LogonScripts\SS5_DriveMappings\" & strComputerName & "--" & strUserName & ".log"
strShareFilePath = "\\domen.ru\SYSVOL\domen.ru\scripts\SS5_Shares.txt"
'Checking script arguments
If objArgs.Count=1 Then
if objArgs(0)="disable" Then
BackupServerName = ""
Else
BackupServerName = objArgs(0)
End If
Else
BackupServerName = ""
End If
' Enable Logging
LogEnabled = True
' Enable silent mode (It is strong recomended for run scripts by double click)
SilentMode = True
WriteLog ""
WriteLog "**********************Logging Start**********************"
WriteLog "Current domain - " & strDomain
WriteLog "Current computer - " & strComputerName
WriteLog "Current user - " & strUserName
WriteLog ""
WriteLog "Starting..."
WriteLog ""
'===================== Start work zone ==============================
Dim arCurDisks, intStrNum
Set objTS = objFSO.OpenTextFile(strShareFilePath)
CheckError
intStrNum = 0
Do Until objTS.AtEndOfStream
intStrNum = intStrNum+1
curLine = objTS.ReadLine
curLine = Trim(curLine)
'skip comments and empty lines
If (Left(curLine,1) <> "#" and Left(curLine,1) <> "") Then
WriteLog "Processing line " & intStrNum & " [" & curLine & "]"
'convert string to array
arCurDisks = Split(curLine, "|")
'check array count (must be 3 elements)
If (UBound(arCurDisks) = 2) Then 'Ubound show last element index. Then we checks it with
arCurDisks(0) = Trim(arCurDisks(0))
arCurDisks(1) = Trim(arCurDisks(1))
arCurDisks(2) = Trim(arCurDisks(2))
'check username For disk
If (arCurDisks(0) = "*" Or arCurDisks(0) = strUserName) Then
MapNetworkDrive arCurDisks(1), arCurDisks(2)
Else
WriteLog "Diferent user. Skipping."
End If
Else
WriteLog "Error - wrong count of parametrs"
End If
WriteLog "" 'write delemetr to log file
End If
Loop
objTS.Close
Set colDrives = objNetwork.EnumNetworkDrives
WriteLog "Network drives:"
'enumerate network drives
If colDrives.Count = 0 Then
WriteLog "You have no mapped networked drives"
Else
For i = 0 To colDrives.Count - 1 Step 2
WriteLog colDrives(i) & vbTab & colDrives(i + 1)
Next
End If
'===================== End work zone ================================
WriteLog ""
WriteLog "Script Done"
WriteLog "**********************Logging Stop**********************"
'==========================================================================
' Custum functions Function
'==========================================================================
'---------- Map network drive----------------------------------------------
Function MapNetworkDrive(strDrive, strShare)
strDrive = strDrive & ":"
If objFSO.FolderExists(strShare) Then 'verify share exists
if objFSO.DriveExists(strDrive) Then 'see if drive letter is in use
objNetwork.RemoveNetworkDrive strDrive,True,True
WriteLog "Disconnecting Old Network Drive"
CheckError
end If
'Map new drive
objNetwork.MapNetworkDrive strDrive, strShare
If Err.Number = 0 Then
WriteLog "Drive sucesfully connected"
End If
CheckError
Else
WriteLog "Path doesn't exist: " & strShare
End If
MapNetworkDrive = True
End Function
'==========================================================================
' Common functions Function
'==========================================================================
'---------- Write log messages to screen and log file -------------
Sub WriteLog (logtext)
If LogEnabled = True then
' Write message to screen
If SilentMode = False Then
Wscript.echo logtext
End If
' Write message to log file
Set TextFile = objFSO.OpenTextFile (LogFile, 8, True)
TextFile.WriteLine(Date() &" " & Time() & " : "& logtext)
TextFile.Close()
End IF
End Sub
'---------- Check current error and log it ------------------------
Sub CheckError()
If Err.Number <> 0 Then
WriteLog "An error occurred: 0x" & Hex(Err.Number) & " " & Err.Description
Err.Clear
End If
End Sub
Файл с настройками сетевых дисков:
######################################################## # Enum of users shares for S5 # #------------------------------------------------------# # Format: # # username | drive | share # # or # # * | drive | share # #------------------------------------------------------# # spaces near pipes are ignored # # empty lines are ignored # # coments starts with # # # don't use coments at the and of the lines!!! # #------------------------------------------------------# # Examples: # # iivanov | f | \\server\share # # ppetrov|h|\\server\share2 # # * | f | \\server\share3 # ######################################################## * | S | \\domen.ru\dfs\SS5_Updates * | V | \\domen.ru\dfs\SS5_TransferDesk * | Y | \\domen.ru\dfs\SS5_print iivanova | W | \\SRV-S5\S5\_WORKAKO apetrov | W | \\SRV-S5\S5\_WORKANI ksidorov | W | \\SRV-S5\S5\_WORKMRL
Как видно файл с настройками очень простой. имя пользователя | буква диска | папка Пробелы игнорируются, можно делать комментарии. Имя файла указываем в скрипте в переменной strShareFilePath. Папку куда писать указываем в переменной LogFile. Чтобы скрипт смог писать в паку с логами необходимо дать права пользователям создавать файлы, а владельцу изменять (create files и modify, соответственно)