В компании исторически сложился следующий сценарий размещения личных папок пользователей на сервере:

— Папка пользователя находиться в папке своего отдела
— Ярлыки на папки всех пользователей находятся в папке «Все пользователи»
— В папке пользователя все другие пользователи могут посмотреть список файлов (без возможности открытия) и «положить» новый файл (но не перезаписать имеющийся)

Выполнение данных операций администраторами вручную занимало относительно много времени и нередко приводило к ошибками при выставлении прав, поэтому был написан небольшой скрипт для автоматизации этой задачи.

Использованы функции и куски кода с http://social.technet.microsoft.com.
Для работы требуется icacls.

Требуется указать имя пользователя и папку отдела — остальное скрипт сделает сам.

strDomainName = "MYSUPERDOMAIN"
strSCFolder = "F:\Public\Все пользователи"
 
strInputUserName = InputUserName
strPath = GetPathMy
strOwnerFIO = GetOwnerFIO (strInputUserName)
Call CreateFolderAndSetPerms(strPath,strInputUserName,strOwnerFIO)
WScript.Echo "Готово!"
WScript.Quit
 
 
Function GetOwnerFIO (strObjectName)
    strRootSearch = strDomainName
 
    Set objConnection = CreateObject("ADODB.Connection") 
    objConnection.Open "Provider=ADsDSOObject;" 
    Set objCommand = CreateObject("ADODB.Command") 
    objCommand.ActiveConnection = objConnection     
 
    objCommand.CommandText = _  
    "<LDAP://" & strRootSearch & ">;(&(|(objectCategory=user)(objectCategory=group))" &_ 
     "(samAccountName=" & strObjectName & "));samAccountName,distinguishedName;subtree"     
 
    Set objRecordSet = objCommand.Execute 
    If objRecordset.RecordCount = 0 Then 
WScript.Echo "Пользователь " & strObjectName & " в AD не найден!"
WScript.Quit
 
    Else 
        objRecordSet.MoveFirst 
 
 
        Set objUser = GetObject ("LDAP://" & objRecordSet.Fields("distinguishedName").Value & "") 
        arrAttributes = Array("displayname") 
        objUser.GetInfoEx arrAttributes, 0 
 
        vTempName = objUser.Get("displayname") 
 
			astrWords = split(vTempName) 
				vLast = astrWords(0)
				vFirst = astrWords(1)
				vMiddle = astrWords(2)
				vFullname = vLast & " " & left(vFirst,1) & left(vMiddle,1)
    End If 
    objConnection.Close     
 
GetOwnerFIO = vFullname
End function
 
 
Function GetPathMy( )
myBasePath = "F:\Public"
strPath = GetPath( "Выберите каталог для личной папки пользователя:", myBasePath )
if ((strPath = "") OR (strPath = Null) OR (strPath = myBasePath)) then 
WScript.Echo "Папка - ОБЯЗАТЕЛЬНА!!! :-E"
GetPathMy
end if
GetPathMy = strPath
End Function
 
Function InputUserName( )
strUserName = UserInput( "Введите имя пользователя " & vbCrLf & "Пример `orlovas`:" )
if (strUserName = "") then 
WScript.Echo "Имя пользователя ОБЯЗАТЕЛЬНО!!! :-E"
InputUserName
end if
InputUserName = strUserName
End Function
 
Function UserInput( myPrompt )
' This function prompts the user for some input.
' When the script runs in CSCRIPT.EXE, StdIn is used,
' otherwise the VBScript InputBox( ) function is used.
' myPrompt is the the text used to prompt the user for input.
' The function returns the input typed either on StdIn or in InputBox( ).
' Written by Rob van der Woude
' http://www.robvanderwoude.com
    ' Check if the script runs in CSCRIPT.EXE
    If UCase( Right( WScript.FullName, 12 ) ) = "\CSCRIPT.EXE" Then
        ' If so, use StdIn and StdOut
        WScript.StdOut.Write myPrompt & " "
        UserInput = WScript.StdIn.ReadLine
    Else
        UserInput = InputBox( myPrompt )
    End If
End Function
 
Function GetPath( myPrompt, myBasePath )
 
Const WINDOW_HANDLE = 0
Const OPTIONS = &H21B '0
 
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder _
    (WINDOW_HANDLE, myPrompt, OPTIONS, myBasePath) 
 
If objFolder Is Nothing Then
	GetPath = ""
	Exit Function
End If
 
Set objFolderItem = objFolder.Self
GetPath = objFolderItem.Path
End Function
 
Function CreateFolderAndSetPerms(strFolder, strOwner, strOwnerFIO)
strOwner = strDomainName & "\" & strOwner
Set objShell = CreateObject("Wscript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
 
strHomeFolder = strFolder & "\" & strOwnerFIO
If objFSO.FolderExists(strHomeFolder) Then
   Set objFolder = objFSO.GetFolder(strHomeFolder)
   WScript.Echo strHomeFolder & " уже существует - только обновим права доступа!"
Else
   Set objFolder = objFSO.CreateFolder(strHomeFolder)
End If
 
	If objFSO.FolderExists(strHomeFolder) Then
 		intRunError = objShell.Run("icacls """ & strHomeFolder & """ /inheritance:r", 2, True)
		intRunError = objShell.Run("icacls """ & strHomeFolder & """ /grant """ & strOwner & """:(RX,W,DC)", 2, True)
		intRunError = objShell.Run("icacls """ & strHomeFolder & """ /grant """ & strOwner & """:(OI)(CI)(IO)(M,WO,DC)", 2, True)
		intRunError = objShell.Run("icacls """ & strHomeFolder & """ /grant *S-1-5-32-544:(IO)(CI)(F)", 2, True) 'BUILTIN\Администраторы
		intRunError = objShell.Run("icacls """ & strHomeFolder & """ /grant *S-1-5-18:(IO)(CI)(F)", 2, True) 'NT AUTHORITY\система
		intRunError = objShell.Run("icacls """ & strHomeFolder & """ /grant *S-1-3-0:(OI)(CI)(IO)(F)", 2, True) 'СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ
		intRunError = objShell.Run("icacls """ & strHomeFolder & """ /grant ""MYSUPERDOMAIN\Domain Admins:(OI)(CI)(F)""", 2, True)
		intRunError = objShell.Run("icacls """ & strHomeFolder & """ /grant ""MYSUPERDOMAIN\Domain Users:(OI)(IO)(S,WD,REA,WEA,RA,WA)""", 2, True)
		intRunError = objShell.Run("icacls """ & strHomeFolder & """ /grant ""MYSUPERDOMAIN\Domain Users:(CI)(W,RD,REA,X,RA)""", 2, True)
		If intRunError <> 0 Then
			Wscript.Echo "Error assigning permissions for user " _
			& strUser & " to home folder " & strHomeFolder
		End If
Set oWS = WScript.CreateObject("WScript.Shell")
   sLinkFile = strSCFolder & "\" & strOwnerFIO & ".LNK"
   Set oLink = oWS.CreateShortcut(sLinkFile)
 
   oLink.TargetPath = strHomeFolder
   oLink.Save		
	End If
End Function

Скачать скрипт CreateHomeDirForUser.zip.