Пользователь PowerShell, чтобы получить список всех папок в / downloads / pivots - PullRequest
0 голосов
/ 11 октября 2009

Итак, у меня есть множество сводных таблиц, которые я загружаю каждый день в такие папки, как: Pivot0001 Pivot0002 Pivot0003

и т. Д.

У меня также есть группы пользователей под названием Pivot0001 и т. Д. С пользователями, которым требуется доступ к этой папке в ней. Что мне теперь нужно сделать, это установить разрешения для каждой папки (у меня их 400 или около того). Я знаю, что мне нужно сделать цикл и установить разрешения. То, что я не знаю, как сделать, это получить список всех папок и затем установить разрешения для этой папки.

EDIT Я забыл сказать, что это для SharePoint ... извините за это

Вот окончательный код, который работал (не совсем чистый, но работает)

[Void][System.Diagnostics.Stopwatch] $sw;
$sw = New-Object System.Diagnostics.StopWatch;
$sw.Stop();
$sw.Start();
clear   

$path = "\\path\to\webdav\"
$dirs = Get-ChildItem $path -Recurse | Where-Object { $_.Attributes -band [System.IO.FileAttributes]::Directory }
[Void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint");
$SPSite = New-Object Microsoft.SharePoint.SPSite("http://sharepoint");
$OpenWeb = $SpSite.OpenWeb("/Downloads");
[int]$i = 0;
foreach ($dir in $dirs) {
    $i++
    Write-Host "Setting $dir to $dir" -F Green;
    $path = "http://sharepoint/Downloads/" + $dir;
    $TheNewGroup = $OpenWeb.GetFolder($path);
    [Microsoft.SharePoint.SPFolder]$folder = $OpenWeb.GetFolder($path);
    [Microsoft.SharePoint.SPGroupCollection]$spc = $OpenWeb.SiteGroups;
    [Microsoft.SharePoint.SPGroup]$group = $spc[$dir];
    [Microsoft.SharePoint.SProleAssignment]`
        $roleAssignment = New-Object Microsoft.SharePoint.SPRoleAssignment([Microsoft.SharePoint.SPPrincipal]$group);
    $OpenWeb.GetFolder($path).Item.BreakRoleInheritance("true");
    $roleAssignment.RoleDefinitionBindings.Add($OpenWeb.RoleDefinitions["Read"]);
    $OpenWeb.GetFolder($path).Item.RoleAssignments.Add($roleAssignment);
}
Write-Host "found $i Folders" -F Green
$SPSite.Dispose();
$sw.Stop();
$howlong = $sw.Elapsed.ToString();
write-host "Took: " $howlong -f Green;

Ответы [ 3 ]

3 голосов
/ 11 октября 2009

Примерно так должно работать:

$domain = "YOURDOMAIN"
$path = "C:\Your\Folder\Path"

$dirs = Get-ChildItem $path | Where-Object { $_.Attributes -band [System.IO.FileAttributes]::Directory }
foreach ($dir in $dirs)
{
    $acl = Get-Acl $dir.FullName
    $user = $domain + "\" + $dir.Name
    $permission = $user, "FullControl", "Allow"
    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule $permission
    $acl.SetAccessRule($rule)
    $acl | Set-Acl $dir.FullName
}

Вышеприведенное работает для обычного пути локальной файловой системы, но в SharePoint используется другая модель безопасности папок. Я нашел сообщение в блоге Роберта Грюна , в котором объясняется, как программно устанавливать разрешения. Он дает этот пример кода C #:

// get a reference to the folder (this assumes path points to a valid folder)
SPFolder folder = SharePointConfiguration.Site.GetFolder(path);

// get a reference to the Sharepoint group collection
SPGroupCollection spc = SharePointConfiguration.Site.SiteGroups;

// get a reference to the group who’s permissions you want to modify for the folder above
SPGroup group = spc[groupName];

// create a role assignment from the group reference
SPRoleAssignment roleAssignment = new SPRoleAssignment((SPPrincipal)group);

// break role inheritance for folders/files because they will be having permissions separate from their parent file/folder
folder.Item.BreakRoleInheritance(true);

// update the role assignments for the group by adding the permissionSet "TestPermissionLevel" which is a custom
// permissionset I created manually... you can easily use any of the built-in permission sets
roleAssignment.RoleDefinitionBindings.Add(SharePointConfiguration.Site.RoleDefinitions["Test Permission Level"]);

// apply the new roleassignment to the folder.  You can do this at the listitem level if desired (i.e. this could be SPfile.Item.... instead of SPFolder.Item)
folder.Item.RoleAssignments.Add(roleAssignment);

Я уверен, с небольшим переводом, это может быть адаптировано к PowerShell.

0 голосов
/ 16 ноября 2018

ОК, разобрался, чего мне не хватало, вот мой код:

Ключ должен предоставить полный URL-путь к папке для проверки.

if((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -ne $null)
{
    Add-PSSnapin Microsoft.SharePoint.PowerShell
}

function go
{
    $Source = "http://portal.jedi.local"
    $SDL = "Test Document"
    $Site = Get-SPSite $Source
    $Web = Get-SPWeb $Site.URL
    $Lists = $Web.Lists[$SDL]
    $DocFolder = "Add New Folder Tomorrow"
    $FolderPath = [String]::Format("{0}/{1}/{2}",$Site.URL, $SDL, $DocFolder)
    [Hashtable]$docSetProperties = @{}
    $Folders = $Web.GetFolder($FolderPath)        
    $ContentType = $Lists.ContentTypes["infoCloud Set"]
    if(!$Folders.Exists)
    {
        Write-Host "true"
        $docSet = [Microsoft.Office.DocumentManagement.DocumentSets.DocumentSet]::Create ($Lists.RootFolder, $DocFolder, $ContentType.Id, $docSetProperties) 
    }
    else
    {
        Write-Host "false"
    }
}
go 
0 голосов
/ 11 октября 2009

Получение списка папок не совсем просто, но легко понятно:

Get-ChildItem \downloads\pivots | Where-Object { $_.PSIsContainer }

Затем вы можете направить это далее в командлет ForEach-Object, где вы можете установить разрешения:

Get-ChildItem \downloads\pivots |
Where-Object { $_.PSIsContainer } |
ForEach-Object {
    $_.SetAccessControl( ... )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...