10 Commits
1.0.1 ... main

6 changed files with 689 additions and 662 deletions

View File

@@ -1,19 +1,27 @@
#On vérifie que les modules soient bien installés
if (Get-Module -ListAvailable -Name PSWriteColor) {
$modExiste = $true
}
else {
$modExiste = $false
}
Import-Module ActiveDirectory
#Cette étape permet de désactiver les messages de confirmation d'install
Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted
#On récupere le nom de la forest pour déposer les scripts au bon endroit
$domainInfos = Get-ADDomain
$forestName = $domainInfos.Forest
switch ($modExiste) {
$true{Import-Module ActiveDirectory;Import-Module PSWriteColor}
$false{Install-Module PSWriteColor -Confirm:$False;Import-Module ActiveDirectory;Import-Module PSWriteColor}
Default {Import-Module ActiveDirectory;Import-Module PSWriteColor}
}
#On crée et place les scripts de logon pour tous les users
New-Item -Path C:\WINDOWS\SYSVOL\sysvol\$forestName\scripts\ -Name "Tech-N1.bat" -ItemType "file"
$contentToAdd = @"
cmd.exe /c "SET __COMPAT_LAYER=RunAsInvoker & START dsa.msc"
cmd.exe /c "SET __COMPAT_LAYER=RunAsInvoker & START dhcpmgmt.msc"
cmd.exe /c "SET __COMPAT_LAYER=RunAsInvoker & START printmanagement.msc"
"@
Add-Content C:\WINDOWS\SYSVOL\sysvol\$forestName\scripts\Tech-N1.bat $contentToAdd
New-Item -Path C:\WINDOWS\SYSVOL\sysvol\$forestName\scripts\ -Name "Tech-N2.bat" -ItemType "file"
$contentToAdd = @"
cmd.exe /c "SET __COMPAT_LAYER=RunAsInvoker & START dsa.msc"
cmd.exe /c "SET __COMPAT_LAYER=RunAsInvoker & START dhcpmgmt.msc"
cmd.exe /c "SET __COMPAT_LAYER=RunAsInvoker & START printmanagement.msc"
cmd.exe /c "SET __COMPAT_LAYER=RunAsInvoker & START dnsmgmt.msc"
cmd.exe /c "SET __COMPAT_LAYER=RunAsInvoker & START gpmc.msc"
"@
Add-Content C:\WINDOWS\SYSVOL\sysvol\$forestName\scripts\Tech-N2.bat $contentToAdd
#On crée le CSV pour y stocker les ID
$pcName = (Get-ComputerInfo).CSName
@@ -26,7 +34,7 @@ function GenPass { #Genere un mdp aléatoire selon les parametres indiqués
U = [Char[]]'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
L = [Char[]]'abcdefghijklmnopqrstuvwxyz'
N = [Char[]]'0123456789'
S = [Char[]]'!"#$%&()*+,-.:;<=>?@[]^_`{}~'
S = [Char[]]'!"#$%&()*+-.:<=>?@[]^_`{}~'
}
$Upper = Get-Random -Count 5 -InputObject $TokenSet.U
@@ -60,8 +68,8 @@ $grpDomainAdm = "S-1-5-21-$domaineSID-512"
$grpPrintOp = "S-1-5-32-550"
#$grpServerOp = "S-1-5-32-549" Pas utilisé
#$grpPowerUsers = "S-1-5-32-547" Déprécié
$grpDHCPadm = "S-1-5-21-$domaineSID-1135"
$grpDHCPuser = "S-1-5-21-$domaineSID-1134"
$grpDHCPadm = "Administrateurs DHCP"
$grpDHCPuser = "Utilisateurs DHCP"
$grpGPOadmin = "S-1-5-21-$domaineSID-520"
$grpNetAdmin = "S-1-5-32-556"
#################################
@@ -75,7 +83,7 @@ ForEach($user in $userList){
# On vérifie si l'utilisateur existe déjà, passe au suivant si oui
$existingUser = Get-ADUser -Filter { Name -eq $user } -ErrorAction SilentlyContinue
if ($existingUser) {
Write-Color -Text "L'utilisateur ", $user, " existe deje. Application des permissions." -Color White, Yellow
Write-Host "L'utilisateur " -ForegroundColor White -NoNewline; Write-Host $user -ForegroundColor Yellow -NoNewline; Write-Host " existe deja. Application des permissions." -ForegroundColor White
}
$userPass = (GenPass)
$userEncPass = ConvertTo-SecureString -String $userPass -AsPlainText -Force
@@ -91,7 +99,7 @@ ForEach($user in $userList){
#...puis on l'ajoute aux bons groupes
switch ($user) {
"Tech-N1"{$Groups = @($grpAccountOp,$grpPrintOp,$grpDHCPuser)}
"Tech-N2"{$Groups = @($grpAccountOp,$grpPrintOp,$grpDHCPadm,$grpGPOadmin,$grpNetAdmin)}
"Tech-N2"{$Groups = @($grpAccountOp,$grpPrintOp,$grpGPOadmin,$grpNetAdmin,$grpDHCPadm)}
"Tech-N3"{$Groups = @($grpDomainAdm)}
Default {}
}
@@ -101,15 +109,16 @@ ForEach($user in $userList){
ForEach ($Group in $Groups) {
Add-ADPrincipalGroupMembership $User -MemberOf $Group
Add-ADPrincipalGroupMembership $User -MemberOf $Group
}
Write-Color -Text "L'utilisateur ",$User," a bien ete cree. Son mot de passe est ",$userPass -Color White,Green,White,Cyan
Write-Host "L'utilisateur " -ForegroundColor White -NoNewline; Write-Host $User -ForegroundColor Green -NoNewline; Write-Host " a bien ete cree. Son mot de passe est " -ForegroundColor White -NoNewline; Write-Host $userPass -ForegroundColor Cyan
}
catch {
Write-Error "Erreur pour l'utilisateur $user : $_"
}
}
Write-Color -Text "Les utilisateurs ainsi que leur mots de passes ont ete exportes ici : ","C:\techLogins-$pcName.csv" -Color White,Green
Get-ADUser Tech-N1 | Set-ADUser -ScriptPath "Tech-N1.bat"
Get-ADUser Tech-N2 | Set-ADUser -ScriptPath "Tech-N2.bat"
Write-Host "Les utilisateurs ainsi que leur mots de passes ont ete exportes ici : " -ForegroundColor White -NoNewline; Write-Host "C:\techLogins-$pcName.csv" -ForegroundColor Green

View File

@@ -1,631 +0,0 @@
<File version="3.2">
<FileID>27bdac5f-55ae-4908-a755-ee5f598a9689</FileID>
<Preview>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
5LG8HjUAAAAASUVORK5CYII=</Preview>
<Form>2ZCr1rhxuBUAACODCAAAAAAABADVWFlzqkoQfk9V/gPFa6wjGnGpilaJW0xwAVyS85JiGYEIM2YY3H79nRFz
QyJRPLe8laNVOEA33f19vQzeDYxXYJKgdn3FcXfRCUc2C1DltU1AgP9r6kILrYJfbYT96Jjhkm5l
uAnAgYtgtfBLYN8M1wg9EmJQhSAkWPcy3DA0PNd8BJsRmgNYNUolXTTFYq5yWwBCucJzUPep5Rl9
Xo7nTMf1LEzl+AaCBCMv4HduUkeHGC0AJpu9Qj0kSDN1DzRdH0DmBBUtZrjc7V32XfSUag9ZgK+1
qaWTOg3PBZBo7pYqFPNihrstF08q9emRr+1COymrER2TIQpcQkPhaw1qDWDNxADAk7ojsCYsDuwf
iraW9El7ORnp1t6fF7a+y+7uvoueToUpMCRMTwG+eEKsgGFEpo6mxSEYMjL1CMNcOZ/hxMN8ONTp
udD1Qz+iN0+9zgsptCJ6Y46m0IlMFG5zNIPyaRRGutGFFlizcJLE4/w2kRnSYiAN5C88QID1ybuX
g9tf+M9GCZA+HVjeSWh98VwgAOqQvBho/aepUKQVWyml5vTDYGpKc0LatIkxmuhRnFGGcMPRoc24
/PDqJXb9byFRXywYuOezKCFs0VZINh6FuY8gSIHxZ+ZT9YCI+ZiX51GfMHeOUp8wPc6mTgoJQfDi
zAUAWn9aeKUShaZYSI0/s5Ua+BLlNn8m7mIa8d087QxSiI4DMHGDUPd2+Snp5ryBPIT52giHiYka
r266qTDnUcwvu/V/reUegKFGsLu4eE7QORIGzNLIAZS3s7Kj6+s2YBswF9pnjtwujSn2ZCrArhxt
bwh5O0gYNkz4ctDE3KKOqWAGKCAmeB9iDKgDb3guG48my659RH9Oo6Mep9+0fKYvhdpQtyxKF19j
JUct0WOaMnXQikXEwh65i+D7skis791GO5+47fm+wNP0mqjA/wUhYXceL73PJykm6v+Xcsdz67v3
H8+1IdsI8jXVtZ3TLz9NetpEK/il+n5o7R1UnqXj+dHC+1p2f0lcHiMvfWAnad715Ri9kgt1vKm5
E2mgroTHjo3q9NPXxk5rbNOVxE7rSqP+zH5n5WzFYQupY0mjcatelzvDRnbtSAq76q20tre9vqLL
wZIemnglecZ6o7G7kiOoE0cY5yu+dW85pj+um532woBKaPgTodtUwp5WyP1uWc87y4+TB7XVHl9f
DVo3ZD4PBvZrXVFk/8nU9YfyWBTmsmAoW1smrlp4EGcN/GY43XJhbLS7EEzXheWjKvRCy/QCufDc
7c/1smtQ32ZyZ2RslFFvXGkpEtm+hUOCJLsuK6IElH7JNn+3+t2bp1U7V5yK5k19qi21gvTQJ9vu
swwHgTRTl/dPSh+p11eToY/qQTecytoMik759am40ge9J00NRa3fUo3n4lZeyds3+RHPwdY28sCt
lJedpTZVVk7oWqORUhha9280Yoab9KCOxRaeP9i2Xa3eZff0pCR3/2KT2ChO/zmxa8e3tPHnD9vr
QXONmn3UY5Pmy8/vp8kd4yiyiSopgc0JOYrs4UBNHltNaun4/zz7fWWiS4cbzZ9PxzeN7igfyToX
IUROHqIJjCQ7dZSS92VQ+wd/RWejuBUAAA==</Form>
<Code><![CDATA[
$form1_Load={
#TODO: Initialize Form Controls here
Set-ControlTheme $form1 -Theme Dark
}
$darkToolStripMenuItem_Click={
#TODO: Place custom script here
Set-ControlTheme -Control $form1 -Theme Dark
}
$lightToolStripMenuItem_Click={
Set-ControlTheme -Control $form1 -Theme Light
}
#region Control Theme Helper Function
<#
.SYNOPSIS
Applies a theme to the control and its children.
.PARAMETER Control
The control to theme. Usually the form itself.
.PARAMETER Theme
The color theme:
Light
Dark
.PARAMETER CustomColor
A hashtable that contains the color values.
Keys:
WindowColor
ContainerColor
BackColor
ForeColor
BorderColor
SelectionForeColor
SelectionBackColor
MenuSelectionColor
.EXAMPLE
PS C:\> Set-ControlTheme -Control $form1 -Theme Dark
.EXAMPLE
PS C:\> Set-ControlTheme -Control $form1 -CustomColor @{ WindowColor = 'White'; ContainerBackColor = 'Gray'; BackColor... }
.NOTES
Created by SAPIEN Technologies, Inc.
#>
function Set-ControlTheme
{
[CmdletBinding()]
param
(
[Parameter(Mandatory = $true)]
[ValidateNotNull()]
[System.ComponentModel.Component]$Control,
[ValidateSet('Light', 'Dark')]
[string]$Theme = 'Dark',
[System.Collections.Hashtable]$CustomColor
)
$Font = [System.Drawing.Font]::New('Segoe UI', 9)
#Initialize the colors
if ($Theme -eq 'Dark')
{
$WindowColor = [System.Drawing.Color]::FromArgb(32, 32, 32)
$ContainerColor = [System.Drawing.Color]::FromArgb(45, 45, 45)
$BackColor = [System.Drawing.Color]::FromArgb(32, 32, 32)
$ForeColor = [System.Drawing.Color]::White
$BorderColor = [System.Drawing.Color]::DimGray
$SelectionBackColor = [System.Drawing.SystemColors]::Highlight
$SelectionForeColor = [System.Drawing.Color]::White
$MenuSelectionColor = [System.Drawing.Color]::DimGray
}
else
{
$WindowColor = [System.Drawing.Color]::White
$ContainerColor = [System.Drawing.Color]::WhiteSmoke
$BackColor = [System.Drawing.Color]::Gainsboro
$ForeColor = [System.Drawing.Color]::Black
$BorderColor = [System.Drawing.Color]::DimGray
$SelectionBackColor = [System.Drawing.SystemColors]::Highlight
$SelectionForeColor = [System.Drawing.Color]::White
$MenuSelectionColor = [System.Drawing.Color]::LightSteelBlue
}
if ($CustomColor)
{
#Check and Validate the custom colors:
$Color = $CustomColor.WindowColor -as [System.Drawing.Color]
if ($Color) { $WindowColor = $Color }
$Color = $CustomColor.ContainerColor -as [System.Drawing.Color]
if ($Color) { $ContainerColor = $Color }
$Color = $CustomColor.BackColor -as [System.Drawing.Color]
if ($Color) { $BackColor = $Color }
$Color = $CustomColor.ForeColor -as [System.Drawing.Color]
if ($Color) { $ForeColor = $Color }
$Color = $CustomColor.BorderColor -as [System.Drawing.Color]
if ($Color) { $BorderColor = $Color }
$Color = $CustomColor.SelectionBackColor -as [System.Drawing.Color]
if ($Color) { $SelectionBackColor = $Color }
$Color = $CustomColor.SelectionForeColor -as [System.Drawing.Color]
if ($Color) { $SelectionForeColor = $Color }
$Color = $CustomColor.MenuSelectionColor -as [System.Drawing.Color]
if ($Color) { $MenuSelectionColor = $Color }
}
#Define the custom renderer for the menus
#region Add-Type definition
try
{
[SAPIENTypes.SAPIENColorTable] | Out-Null
}
catch
{
if ($PSVersionTable.PSVersion.Major -ge 7)
{
$Assemblies = 'System.Windows.Forms', 'System.Drawing', 'System.Drawing.Primitives'
}
else
{
$Assemblies = 'System.Windows.Forms', 'System.Drawing'
}
Add-Type -ReferencedAssemblies $Assemblies -TypeDefinition "
using System;
using System.Windows.Forms;
using System.Drawing;
namespace SAPIENTypes
{
public class SAPIENColorTable : ProfessionalColorTable
{
Color ContainerBackColor;
Color BackColor;
Color BorderColor;
Color SelectBackColor;
public SAPIENColorTable(Color containerColor, Color backColor, Color borderColor, Color selectBackColor)
{
ContainerBackColor = containerColor;
BackColor = backColor;
BorderColor = borderColor;
SelectBackColor = selectBackColor;
}
public override Color MenuStripGradientBegin { get { return ContainerBackColor; } }
public override Color MenuStripGradientEnd { get { return ContainerBackColor; } }
public override Color ToolStripBorder { get { return BorderColor; } }
public override Color MenuItemBorder { get { return SelectBackColor; } }
public override Color MenuItemSelected { get { return SelectBackColor; } }
public override Color SeparatorDark { get { return BorderColor; } }
public override Color ToolStripDropDownBackground { get { return BackColor; } }
public override Color MenuBorder { get { return BorderColor; } }
public override Color MenuItemSelectedGradientBegin { get { return SelectBackColor; } }
public override Color MenuItemSelectedGradientEnd { get { return SelectBackColor; } }
public override Color MenuItemPressedGradientBegin { get { return ContainerBackColor; } }
public override Color MenuItemPressedGradientEnd { get { return ContainerBackColor; } }
public override Color MenuItemPressedGradientMiddle { get { return ContainerBackColor; } }
public override Color ImageMarginGradientBegin { get { return BackColor; } }
public override Color ImageMarginGradientEnd { get { return BackColor; } }
public override Color ImageMarginGradientMiddle { get { return BackColor; } }
}
}"
}
#endregion
$colorTable = New-Object SAPIENTypes.SAPIENColorTable -ArgumentList $ContainerColor, $BackColor, $BorderColor, $MenuSelectionColor
$render = New-Object System.Windows.Forms.ToolStripProfessionalRenderer -ArgumentList $colorTable
[System.Windows.Forms.ToolStripManager]::Renderer = $render
#Set up our processing queue
$Queue = New-Object System.Collections.Generic.Queue[System.ComponentModel.Component]
$Queue.Enqueue($Control)
Add-Type -AssemblyName System.Core
#Only process the controls once.
$Processed = New-Object System.Collections.Generic.HashSet[System.ComponentModel.Component]
#Apply the colors to the controls
while ($Queue.Count -gt 0)
{
$target = $Queue.Dequeue()
#Skip controls we already processed
if ($Processed.Contains($target)) { continue }
$Processed.Add($target)
#Set the text color
$target.ForeColor = $ForeColor
#region Handle Controls
if ($target -is [System.Windows.Forms.Form])
{
#Set Font
$target.Font = $Font
$target.BackColor = $ContainerColor
}
elseif ($target -is [System.Windows.Forms.SplitContainer])
{
$target.BackColor = $BorderColor
}
elseif ($target -is [System.Windows.Forms.PropertyGrid])
{
$target.BackColor = $BorderColor
$target.ViewBackColor = $BackColor
$target.ViewForeColor = $ForeColor
$target.ViewBorderColor = $BorderColor
$target.CategoryForeColor = $ForeColor
$target.CategorySplitterColor = $ContainerColor
$target.HelpBackColor = $BackColor
$target.HelpForeColor = $ForeColor
$target.HelpBorderColor = $BorderColor
$target.CommandsBackColor = $BackColor
$target.CommandsBorderColor = $BorderColor
$target.CommandsForeColor = $ForeColor
$target.LineColor = $ContainerColor
}
elseif ($target -is [System.Windows.Forms.ContainerControl] -or
$target -is [System.Windows.Forms.Panel])
{
#Set the BackColor for the container
$target.BackColor = $ContainerColor
}
elseif ($target -is [System.Windows.Forms.GroupBox])
{
$target.FlatStyle = 'Flat'
}
elseif ($target -is [System.Windows.Forms.Button])
{
$target.FlatStyle = 'Flat'
$target.FlatAppearance.BorderColor = $BorderColor
$target.BackColor = $BackColor
}
elseif ($target -is [System.Windows.Forms.CheckBox] -or
$target -is [System.Windows.Forms.RadioButton] -or
$target -is [System.Windows.Forms.Label])
{
#$target.FlatStyle = 'Flat'
}
elseif ($target -is [System.Windows.Forms.ComboBox])
{
$target.BackColor = $BackColor
$target.FlatStyle = 'Flat'
}
elseif ($target -is [System.Windows.Forms.TextBox])
{
$target.BorderStyle = 'FixedSingle'
$target.BackColor = $BackColor
}
elseif ($target -is [System.Windows.Forms.DataGridView])
{
$target.GridColor = $BorderColor
$target.BackgroundColor = $ContainerColor
$target.DefaultCellStyle.BackColor = $WindowColor
$target.DefaultCellStyle.SelectionBackColor = $SelectionBackColor
$target.DefaultCellStyle.SelectionForeColor = $SelectionForeColor
$target.ColumnHeadersDefaultCellStyle.BackColor = $ContainerColor
$target.ColumnHeadersDefaultCellStyle.ForeColor = $ForeColor
$target.EnableHeadersVisualStyles = $false
$target.ColumnHeadersBorderStyle = 'Single'
$target.RowHeadersBorderStyle = 'Single'
$target.RowHeadersDefaultCellStyle.BackColor = $ContainerColor
$target.RowHeadersDefaultCellStyle.ForeColor = $ForeColor
}
elseif ($PSVersionTable.PSVersion.Major -le 5 -and $target -is [System.Windows.Forms.DataGrid])
{
$target.CaptionBackColor = $WindowColor
$target.CaptionForeColor = $ForeColor
$target.BackgroundColor = $ContainerColor
$target.BackColor = $WindowColor
$target.ForeColor = $ForeColor
$target.HeaderBackColor = $ContainerColor
$target.HeaderForeColor = $ForeColor
$target.FlatMode = $true
$target.BorderStyle = 'FixedSingle'
$target.GridLineColor = $BorderColor
$target.AlternatingBackColor = $ContainerColor
$target.SelectionBackColor = $SelectionBackColor
$target.SelectionForeColor = $SelectionForeColor
}
elseif ($target -is [System.Windows.Forms.ToolStrip])
{
$target.BackColor = $BackColor
$target.Renderer = $render
foreach ($item in $target.Items)
{
$Queue.Enqueue($item)
}
}
elseif ($target -is [System.Windows.Forms.ToolStripMenuItem] -or
$target -is [System.Windows.Forms.ToolStripDropDown] -or
$target -is [System.Windows.Forms.ToolStripDropDownItem])
{
$target.BackColor = $BackColor
foreach ($item in $target.DropDownItems)
{
$Queue.Enqueue($item)
}
}
elseif ($target -is [System.Windows.Forms.ListBox] -or
$target -is [System.Windows.Forms.ListView] -or
$target -is [System.Windows.Forms.TreeView])
{
$target.BackColor = $WindowColor
}
else
{
$target.BackColor = $BackColor
}
#endregion
if ($target -is [System.Windows.Forms.Control])
{
#Queue all the child controls
foreach ($child in $target.Controls)
{
$Queue.Enqueue($child)
}
if ($target.ContextMenuStrip)
{
$Queue.Enqueue($target.ContextMenuStrip);
}
}
}
}
#endregion
$send_Click={
Register-PnPEntraIDAppForInteractiveLogin -ApplicationName "$appName_box" -Tenant $tenant_box -Interactive
}
$tenant_box_TextChanged={
#TODO: Place custom script here
}
#region Control Helper Functions
<#
.SYNOPSIS
Sets the emulation of the WebBrowser control for the application.
.DESCRIPTION
Sets the emulation of the WebBrowser control for the application using the installed version of IE.
This improves the WebBrowser control compatibility with newer html features.
.PARAMETER ExecutableName
The name of the executable E.g. PowerShellStudio.exe.
Default Value: The running executable name.
.EXAMPLE
PS C:\> Set-WebBrowserEmulation
.EXAMPLE
PS C:\> Set-WebBrowserEmulation PowerShell.exe
#>
function Set-WebBrowserEmulation
{
param
(
[ValidateNotNullOrEmpty()]
[string]
$ExecutableName = [System.IO.Path]::GetFileName([System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName)
)
#region Get IE Version
$valueNames = 'svcVersion', 'svcUpdateVersion', 'Version', 'W2kVersion'
$version = 0;
for ($i = 0; $i -lt $valueNames.Length; $i++)
{
$objVal = [Microsoft.Win32.Registry]::GetValue('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer', $valueNames[$i], '0')
$strVal = [System.Convert]::ToString($objVal)
if ($strVal)
{
$iPos = $strVal.IndexOf('.')
if ($iPos -gt 0)
{
$strVal = $strVal.Substring(0, $iPos)
}
$res = 0;
if ([int]::TryParse($strVal, [ref]$res))
{
$version = [Math]::Max($version, $res)
}
}
}
if ($version -lt 7)
{
$version = 7000
}
else
{
$version = $version * 1000
}
#endregion
[Microsoft.Win32.Registry]::SetValue('HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION', $ExecutableName, $version)
}
#endregion
$webbrowser1_DocumentCompleted=[System.Windows.Forms.WebBrowserDocumentCompletedEventHandler]{
#Event Argument: $_ = [System.Windows.Forms.WebBrowserDocumentCompletedEventArgs]
#TODO: Place custom script here
}
]]></Code>
<TV>0</TV>
<Mode>1</Mode>
<Assemblies />
</File>

View File

@@ -297,7 +297,9 @@ fV+cKsvHZ7mHlNub8WCOBL8dTiR1Cnm7+PacX2n97rOqhLzaayj6S34rraTtu/TkzcDW0nPAKRWX
raU6kVd26JjDocwNzMd37DGJm9hRRnzDm3Usy6pUypkdHkq4uzegxEZx/gti1I4fyAvpcXs9aq5x
s999NUpYX35+P03uGCcjmyhCGdgsm8WRPV5Qk5etOtZ0+mPsbl+ZaNLxRvPn4/im0Z3kkSxzFSBS
8iKaQCTZqJNIPoZ+9T9wSmBFXRkAAA==</Form>
<Code><![CDATA[
<Code><![CDATA[Import-Module Az
$form1_Load={
#TODO: Initialize Form Controls here
@@ -631,14 +633,11 @@ namespace SAPIENTypes
$send_Click={
$regJob = Start-Job -Name regJob -ScriptBlock {Register-PnPEntraIDAppForInteractiveLogin -ApplicationName "$appName_box" -Tenant $tenant_box -Interactive}
while ($getRegJob[-1].State =$false)
{
$getRegJob = Get-Job -Name regJob
}
$resultsBox.Text = Receive-Job -Job $regJob
$getRegJob= @()
$resultsBox.Text = (Register-PnPEntraIDAppForInteractiveLogin -ApplicationName "$appName_box" -Tenant $tenant_box -Interactive)
}
}
]]></Code>
<TV>0</TV>

View File

@@ -0,0 +1,322 @@
if($args[0] -eq $null)
{
$spUrl = Read-Host "Adresse du SharePoint du client (ex: https//client.sharepoint.com) "
$spSite = Read-Host "Nom du site (ce qu'il y a apres '/sites/' dans l'URL du site en question) "
$pnpCiD = Read-Host "Votre Client ID (ex: fa7800b5-0298-4205-a369-ffb976de3058) "
}
else
{
$spUrl=$args[0]
$spSite=$args[1]
$pnpCiD=$args[2]
}
#Function to Get Permissions Applied on a particular Object, such as: Web, List, Folder or List Item
Function Get-PnPPermissions([Microsoft.SharePoint.Client.SecurableObject]$Object)
{
#Determine the type of the object
Switch($Object.TypedObject.ToString())
{
"Microsoft.SharePoint.Client.Web" { $ObjectType = "Site" ; $ObjectURL = $Object.URL; $ObjectTitle = $Object.Title }
"Microsoft.SharePoint.Client.ListItem"
{
If($Object.FileSystemObjectType -eq "Folder")
{
$ObjectType = "Folder"
#Get the URL of the Folder
$Folder = Get-PnPProperty -ClientObject $Object -Property Folder
$ObjectTitle = $Object.Folder.Name
$ObjectURL = $("{0}{1}" -f $Web.Url.Replace($Web.ServerRelativeUrl,''),$Object.Folder.ServerRelativeUrl)
}
Else #File or List Item
{
#Get the URL of the Object
Get-PnPProperty -ClientObject $Object -Property File, ParentList
If($Object.File.Name -ne $Null)
{
$ObjectType = "File"
$ObjectTitle = $Object.File.Name
$ObjectURL = $("{0}{1}" -f $Web.Url.Replace($Web.ServerRelativeUrl,''),$Object.File.ServerRelativeUrl)
}
else
{
$ObjectType = "List Item"
$ObjectTitle = $Object["Title"]
#Get the URL of the List Item
$DefaultDisplayFormUrl = Get-PnPProperty -ClientObject $Object.ParentList -Property DefaultDisplayFormUrl
$ObjectURL = $("{0}{1}?ID={2}" -f $Web.Url.Replace($Web.ServerRelativeUrl,''), $DefaultDisplayFormUrl,$Object.ID)
}
}
}
Default
{
$ObjectType = "List or Library"
$ObjectTitle = $Object.Title
#Get the URL of the List or Library
$RootFolder = Get-PnPProperty -ClientObject $Object -Property RootFolder
$ObjectURL = $("{0}{1}" -f $Web.Url.Replace($Web.ServerRelativeUrl,''), $RootFolder.ServerRelativeUrl)
}
}
#Get permissions assigned to the object
Get-PnPProperty -ClientObject $Object -Property HasUniqueRoleAssignments, RoleAssignments
#Check if Object has unique permissions
$HasUniquePermissions = $Object.HasUniqueRoleAssignments
#Loop through each permission assigned and extract details
$PermissionCollection = @()
Foreach($RoleAssignment in $Object.RoleAssignments)
{
#Get the Permission Levels assigned and Member
Get-PnPProperty -ClientObject $RoleAssignment -Property RoleDefinitionBindings, Member
#Get the Principal Type: User, SP Group, AD Group
$PermissionType = $RoleAssignment.Member.PrincipalType
#Get the Permission Levels assigned
$PermissionLevels = $RoleAssignment.RoleDefinitionBindings | Select -ExpandProperty Name
#Remove Limited Access
$PermissionLevels = ($PermissionLevels | Where { $_ -ne "Limited Access"}) -join ","
#Leave Principals with no Permissions
If($PermissionLevels.Length -eq 0) {Continue}
#Get SharePoint group members
If($PermissionType -eq "SharePointGroup")
{
#Get Group Members
$GroupMembers = Get-PnPGroupMember -Identity $RoleAssignment.Member.LoginName
#Leave Empty Groups
If($GroupMembers.count -eq 0){Continue}
$GroupUsers = ($GroupMembers | Select -ExpandProperty Title) -join ","
#Add the Data to Object
$Permissions = New-Object PSObject
$Permissions | Add-Member NoteProperty Object($ObjectType)
$Permissions | Add-Member NoteProperty Title($ObjectTitle)
$Permissions | Add-Member NoteProperty URL($ObjectURL)
$Permissions | Add-Member NoteProperty HasUniquePermissions($HasUniquePermissions)
$Permissions | Add-Member NoteProperty Users($GroupUsers)
$Permissions | Add-Member NoteProperty Type($PermissionType)
$Permissions | Add-Member NoteProperty Permissions($PermissionLevels)
$Permissions | Add-Member NoteProperty GrantedThrough("SharePoint Group: $($RoleAssignment.Member.LoginName)")
$PermissionCollection += $Permissions
}
Else
{
#Add the Data to Object
$Permissions = New-Object PSObject
$Permissions | Add-Member NoteProperty Object($ObjectType)
$Permissions | Add-Member NoteProperty Title($ObjectTitle)
$Permissions | Add-Member NoteProperty URL($ObjectURL)
$Permissions | Add-Member NoteProperty HasUniquePermissions($HasUniquePermissions)
$Permissions | Add-Member NoteProperty Users($RoleAssignment.Member.Title)
$Permissions | Add-Member NoteProperty Type($PermissionType)
$Permissions | Add-Member NoteProperty Permissions($PermissionLevels)
$Permissions | Add-Member NoteProperty GrantedThrough("Direct Permissions")
$PermissionCollection += $Permissions
}
}
#Export Permissions to CSV File
$PermissionCollection | Export-CSV $ReportFile -NoTypeInformation -Append
}
#Function to get sharepoint online site permissions report
Function Generate-PnPSitePermissionRpt()
{
[cmdletbinding()]
Param
(
[Parameter(Mandatory=$false)] [String] $SiteURL,
[Parameter(Mandatory=$false)] [String] $ReportFile,
[Parameter(Mandatory=$false)] [switch] $Recursive,
[Parameter(Mandatory=$false)] [switch] $ScanItemLevel,
[Parameter(Mandatory=$false)] [switch] $IncludeInheritedPermissions
)
Try {
#Connect to the Site
Connect-PnPOnline -Url $spUrl -Interactive -ClientId $pnpCiD
#Get the Web
$Web = Get-PnPWeb
Write-host -f Yellow "Getting Site Collection Administrators..."
#Get Site Collection Administrators
$SiteAdmins = Get-PnPSiteCollectionAdmin
$SiteCollectionAdmins = ($SiteAdmins | Select -ExpandProperty Title) -join ","
#Add the Data to Object
$Permissions = New-Object PSObject
$Permissions | Add-Member NoteProperty Object("Site Collection")
$Permissions | Add-Member NoteProperty Title($Web.Title)
$Permissions | Add-Member NoteProperty URL($Web.URL)
$Permissions | Add-Member NoteProperty HasUniquePermissions("TRUE")
$Permissions | Add-Member NoteProperty Users($SiteCollectionAdmins)
$Permissions | Add-Member NoteProperty Type("Site Collection Administrators")
$Permissions | Add-Member NoteProperty Permissions("Site Owner")
$Permissions | Add-Member NoteProperty GrantedThrough("Direct Permissions")
#Export Permissions to CSV File
$Permissions | Export-CSV $ReportFile -NoTypeInformation
#Function to Get Permissions of All List Items of a given List
Function Get-PnPListItemsPermission([Microsoft.SharePoint.Client.List]$List)
{
Write-host -f Yellow "`t `t Getting Permissions of List Items in the List:"$List.Title
#Get All Items from List in batches
$ListItems = Get-PnPListItem -List $List -PageSize 500
$ItemCounter = 0
#Loop through each List item
ForEach($ListItem in $ListItems)
{
#Get Objects with Unique Permissions or Inherited Permissions based on 'IncludeInheritedPermissions' switch
If($IncludeInheritedPermissions)
{
Get-PnPPermissions -Object $ListItem
}
Else
{
#Check if List Item has unique permissions
$HasUniquePermissions = Get-PnPProperty -ClientObject $ListItem -Property HasUniqueRoleAssignments
If($HasUniquePermissions -eq $True)
{
#Call the function to generate Permission report
Get-PnPPermissions -Object $ListItem
}
}
$ItemCounter++
Write-Progress -PercentComplete ($ItemCounter / ($List.ItemCount) * 100) -Activity "Processing Items $ItemCounter of $($List.ItemCount)" -Status "Searching Unique Permissions in List Items of '$($List.Title)'"
}
}
#Function to Get Permissions of all lists from the given web
Function Get-PnPListPermission([Microsoft.SharePoint.Client.Web]$Web)
{
#Get All Lists from the web
$Lists = Get-PnPProperty -ClientObject $Web -Property Lists
#Exclude system lists
$ExcludedLists = @("Access Requests","App Packages","appdata","appfiles","Apps in Testing","Cache Profiles","Composed Looks","Content and Structure Reports","Content type publishing error log","Converted Forms",
"Device Channels","Form Templates","fpdatasources","Get started with Apps for Office and SharePoint","List Template Gallery", "Long Running Operation Status","Maintenance Log Library", "Images", "site collection images"
,"Master Docs","Master Page Gallery","MicroFeed","NintexFormXml","Quick Deploy Items","Relationships List","Reusable Content","Reporting Metadata", "Reporting Templates", "Search Config List","Site Assets","Preservation Hold Library",
"Site Pages", "Solution Gallery","Style Library","Suggested Content Browser Locations","Theme Gallery", "TaxonomyHiddenList","User Information List","Web Part Gallery","wfpub","wfsvc","Workflow History","Workflow Tasks", "Pages")
$Counter = 0
#Get all lists from the web
ForEach($List in $Lists)
{
#Exclude System Lists
If($List.Hidden -eq $False -and $ExcludedLists -notcontains $List.Title)
{
$Counter++
Write-Progress -PercentComplete ($Counter / ($Lists.Count) * 100) -Activity "Exporting Permissions from List '$($List.Title)' in $($Web.URL)" -Status "Processing Lists $Counter of $($Lists.Count)"
#Get Item Level Permissions if 'ScanItemLevel' switch present
If($ScanItemLevel)
{
#Get List Items Permissions
Get-PnPListItemsPermission -List $List
}
#Get Lists with Unique Permissions or Inherited Permissions based on 'IncludeInheritedPermissions' switch
If($IncludeInheritedPermissions)
{
Get-PnPPermissions -Object $List
}
Else
{
#Check if List has unique permissions
$HasUniquePermissions = Get-PnPProperty -ClientObject $List -Property HasUniqueRoleAssignments
If($HasUniquePermissions -eq $True)
{
#Call the function to check permissions
Get-PnPPermissions -Object $List
}
}
}
}
}
#Function to Get Webs's Permissions from given URL
Function Get-PnPWebPermission([Microsoft.SharePoint.Client.Web]$Web)
{
#Call the function to Get permissions of the web
Write-host -f Yellow "Getting Permissions of the Web: $($Web.URL)..."
Get-PnPPermissions -Object $Web
#Get List Permissions
Write-host -f Yellow "`t Getting Permissions of Lists and Libraries..."
Get-PnPListPermission($Web)
#Recursively get permissions from all sub-webs based on the "Recursive" Switch
If($Recursive)
{
#Get Subwebs of the Web
$Subwebs = Get-PnPProperty -ClientObject $Web -Property Webs
#Iterate through each subsite in the current web
Foreach ($Subweb in $web.Webs)
{
#Get Webs with Unique Permissions or Inherited Permissions based on 'IncludeInheritedPermissions' switch
If($IncludeInheritedPermissions)
{
Get-PnPWebPermission($Subweb)
}
Else
{
#Check if the Web has unique permissions
$HasUniquePermissions = Get-PnPProperty -ClientObject $SubWeb -Property HasUniqueRoleAssignments
#Get the Web's Permissions
If($HasUniquePermissions -eq $true)
{
#Call the function recursively
Get-PnPWebPermission($Subweb)
}
}
}
}
}
#Call the function with RootWeb to get site collection permissions
Get-PnPWebPermission $Web
Write-host -f Green "`n*** Site Permission Report Generated Successfully!***"
}
Catch {
write-host -f Red "Error Generating Site Permission Report!" $_.Exception.Message
}
}
Function Get-FileName($initialDirectory) {
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
Out-Null
$SaveFileDialog = New-Object System.Windows.Forms.SaveFileDialog
$SaveFileDialog.initialDirectory = $initialDirectory
$SaveFileDialog.filter = "CSV (*.csv)|*.csv";
$SaveFileDialog.ShowDialog() | Out-Null
$SaveFileDialog.filename
}
$SaveMyFile = Get-Filename
#region ***Parameters***
$SiteURL=$spUrl+"/sites/"+$spSite
$ReportFile="$SaveMyFile"
#endregion
#Call the function to generate permission report
Generate-PnPSitePermissionRpt -SiteURL $SiteURL -ReportFile $ReportFile -Recursive

View File

@@ -0,0 +1,328 @@
if($args[0] -eq $null)
{
$pnpCiD = Read-Host "Votre Client ID (ex: fa7800b5-0298-4205-a369-ffb976de3058) "
$csvSPpath = Read-Host "Chemin vers la liste des sites (CSV) "
}
else
{
$pnpCiD=$args[0]
$csvSPpath=$args[1]
}
$csvSPfile = Import-Csv -Path "$csvSPpath" -Delimiter "," -Header "SiteName","URL" | select -skip 1
#Function to Get Permissions Applied on a particular Object, such as: Web, List, Folder or List Item
Function Get-PnPPermissions([Microsoft.SharePoint.Client.SecurableObject]$Object)
{
#Determine the type of the object
Switch($Object.TypedObject.ToString())
{
"Microsoft.SharePoint.Client.Web" { $ObjectType = "Site" ; $ObjectURL = $Object.URL; $ObjectTitle = $Object.Title }
"Microsoft.SharePoint.Client.ListItem"
{
If($Object.FileSystemObjectType -eq "Folder")
{
$ObjectType = "Folder"
#Get the URL of the Folder
$Folder = Get-PnPProperty -ClientObject $Object -Property Folder
$ObjectTitle = $Object.Folder.Name
$ObjectURL = $("{0}{1}" -f $Web.Url.Replace($Web.ServerRelativeUrl,''),$Object.Folder.ServerRelativeUrl)
}
Else #File or List Item
{
#Get the URL of the Object
Get-PnPProperty -ClientObject $Object -Property File, ParentList
If($Object.File.Name -ne $Null)
{
$ObjectType = "File"
$ObjectTitle = $Object.File.Name
$ObjectURL = $("{0}{1}" -f $Web.Url.Replace($Web.ServerRelativeUrl,''),$Object.File.ServerRelativeUrl)
}
else
{
$ObjectType = "List Item"
$ObjectTitle = $Object["Title"]
#Get the URL of the List Item
$DefaultDisplayFormUrl = Get-PnPProperty -ClientObject $Object.ParentList -Property DefaultDisplayFormUrl
$ObjectURL = $("{0}{1}?ID={2}" -f $Web.Url.Replace($Web.ServerRelativeUrl,''), $DefaultDisplayFormUrl,$Object.ID)
}
}
}
Default
{
$ObjectType = "List or Library"
$ObjectTitle = $Object.Title
#Get the URL of the List or Library
$RootFolder = Get-PnPProperty -ClientObject $Object -Property RootFolder
$ObjectURL = $("{0}{1}" -f $Web.Url.Replace($Web.ServerRelativeUrl,''), $RootFolder.ServerRelativeUrl)
}
}
#Get permissions assigned to the object
Get-PnPProperty -ClientObject $Object -Property HasUniqueRoleAssignments, RoleAssignments
#Check if Object has unique permissions
$HasUniquePermissions = $Object.HasUniqueRoleAssignments
#Loop through each permission assigned and extract details
$PermissionCollection = @()
Foreach($RoleAssignment in $Object.RoleAssignments)
{
#Get the Permission Levels assigned and Member
Get-PnPProperty -ClientObject $RoleAssignment -Property RoleDefinitionBindings, Member
#Get the Principal Type: User, SP Group, AD Group
$PermissionType = $RoleAssignment.Member.PrincipalType
#Get the Permission Levels assigned
$PermissionLevels = $RoleAssignment.RoleDefinitionBindings | Select -ExpandProperty Name
#Remove Limited Access
$PermissionLevels = ($PermissionLevels | Where { $_ -ne "Limited Access"}) -join ","
#Leave Principals with no Permissions
If($PermissionLevels.Length -eq 0) {Continue}
#Get SharePoint group members
If($PermissionType -eq "SharePointGroup")
{
#Get Group Members
$GroupMembers = Get-PnPGroupMember -Identity $RoleAssignment.Member.LoginName
#Leave Empty Groups
If($GroupMembers.count -eq 0){Continue}
$GroupUsers = ($GroupMembers | Select -ExpandProperty Title) -join ","
#Add the Data to Object
$Permissions = New-Object PSObject
$Permissions | Add-Member NoteProperty Object($ObjectType)
$Permissions | Add-Member NoteProperty Title($ObjectTitle)
$Permissions | Add-Member NoteProperty URL($ObjectURL)
$Permissions | Add-Member NoteProperty HasUniquePermissions($HasUniquePermissions)
$Permissions | Add-Member NoteProperty Users($GroupUsers)
$Permissions | Add-Member NoteProperty Type($PermissionType)
$Permissions | Add-Member NoteProperty Permissions($PermissionLevels)
$Permissions | Add-Member NoteProperty GrantedThrough("SharePoint Group: $($RoleAssignment.Member.LoginName)")
$PermissionCollection += $Permissions
}
Else
{
#Add the Data to Object
$Permissions = New-Object PSObject
$Permissions | Add-Member NoteProperty Object($ObjectType)
$Permissions | Add-Member NoteProperty Title($ObjectTitle)
$Permissions | Add-Member NoteProperty URL($ObjectURL)
$Permissions | Add-Member NoteProperty HasUniquePermissions($HasUniquePermissions)
$Permissions | Add-Member NoteProperty Users($RoleAssignment.Member.Title)
$Permissions | Add-Member NoteProperty Type($PermissionType)
$Permissions | Add-Member NoteProperty Permissions($PermissionLevels)
$Permissions | Add-Member NoteProperty GrantedThrough("Direct Permissions")
$PermissionCollection += $Permissions
}
}
#Export Permissions to CSV File
$PermissionCollection | Export-CSV $ReportFile -NoTypeInformation -Append
}
#Function to get sharepoint online site permissions report
Function Generate-PnPSitePermissionRpt()
{
[cmdletbinding()]
Param
(
[Parameter(Mandatory=$false)] [String] $SiteURL,
[Parameter(Mandatory=$false)] [String] $ReportFile,
[Parameter(Mandatory=$false)] [switch] $Recursive,
[Parameter(Mandatory=$false)] [switch] $ScanItemLevel,
[Parameter(Mandatory=$false)] [switch] $IncludeInheritedPermissions
)
Try {
#Connect to the Site
Connect-PnPOnline -Url $SiteURL -Interactive -ClientId $pnpCiD
#Get the Web
$Web = Get-PnPWeb
Write-host -f Yellow "Getting Site Collection Administrators..."
#Get Site Collection Administrators
$SiteAdmins = Get-PnPSiteCollectionAdmin
$SiteCollectionAdmins = ($SiteAdmins | Select -ExpandProperty Title) -join ","
#Add the Data to Object
$Permissions = New-Object PSObject
$Permissions | Add-Member NoteProperty Object("Site Collection")
$Permissions | Add-Member NoteProperty Title($Web.Title)
$Permissions | Add-Member NoteProperty URL($Web.URL)
$Permissions | Add-Member NoteProperty HasUniquePermissions("TRUE")
$Permissions | Add-Member NoteProperty Users($SiteCollectionAdmins)
$Permissions | Add-Member NoteProperty Type("Site Collection Administrators")
$Permissions | Add-Member NoteProperty Permissions("Site Owner")
$Permissions | Add-Member NoteProperty GrantedThrough("Direct Permissions")
#Export Permissions to CSV File
$Permissions | Export-CSV $ReportFile -NoTypeInformation
#Function to Get Permissions of All List Items of a given List
Function Get-PnPListItemsPermission([Microsoft.SharePoint.Client.List]$List)
{
Write-host -f Yellow "`t `t Getting Permissions of List Items in the List:"$List.Title
#Get All Items from List in batches
$ListItems = Get-PnPListItem -List $List -PageSize 500
$ItemCounter = 0
#Loop through each List item
ForEach($ListItem in $ListItems)
{
#Get Objects with Unique Permissions or Inherited Permissions based on 'IncludeInheritedPermissions' switch
If($IncludeInheritedPermissions)
{
Get-PnPPermissions -Object $ListItem
}
Else
{
#Check if List Item has unique permissions
$HasUniquePermissions = Get-PnPProperty -ClientObject $ListItem -Property HasUniqueRoleAssignments
If($HasUniquePermissions -eq $True)
{
#Call the function to generate Permission report
Get-PnPPermissions -Object $ListItem
}
}
$ItemCounter++
Write-Progress -PercentComplete ($ItemCounter / ($List.ItemCount) * 100) -Activity "Processing Items $ItemCounter of $($List.ItemCount)" -Status "Searching Unique Permissions in List Items of '$($List.Title)'"
}
}
#Function to Get Permissions of all lists from the given web
Function Get-PnPListPermission([Microsoft.SharePoint.Client.Web]$Web)
{
#Get All Lists from the web
$Lists = Get-PnPProperty -ClientObject $Web -Property Lists
#Exclude system lists
$ExcludedLists = @("Access Requests","App Packages","appdata","appfiles","Apps in Testing","Cache Profiles","Composed Looks","Content and Structure Reports","Content type publishing error log","Converted Forms",
"Device Channels","Form Templates","fpdatasources","Get started with Apps for Office and SharePoint","List Template Gallery", "Long Running Operation Status","Maintenance Log Library", "Images", "site collection images"
,"Master Docs","Master Page Gallery","MicroFeed","NintexFormXml","Quick Deploy Items","Relationships List","Reusable Content","Reporting Metadata", "Reporting Templates", "Search Config List","Site Assets","Preservation Hold Library",
"Site Pages", "Solution Gallery","Style Library","Suggested Content Browser Locations","Theme Gallery", "TaxonomyHiddenList","User Information List","Web Part Gallery","wfpub","wfsvc","Workflow History","Workflow Tasks", "Pages")
$Counter = 0
#Get all lists from the web
ForEach($List in $Lists)
{
#Exclude System Lists
If($List.Hidden -eq $False -and $ExcludedLists -notcontains $List.Title)
{
$Counter++
Write-Progress -PercentComplete ($Counter / ($Lists.Count) * 100) -Activity "Exporting Permissions from List '$($List.Title)' in $($Web.URL)" -Status "Processing Lists $Counter of $($Lists.Count)"
#Get Item Level Permissions if 'ScanItemLevel' switch present
If($ScanItemLevel)
{
#Get List Items Permissions
Get-PnPListItemsPermission -List $List
}
#Get Lists with Unique Permissions or Inherited Permissions based on 'IncludeInheritedPermissions' switch
If($IncludeInheritedPermissions)
{
Get-PnPPermissions -Object $List
}
Else
{
#Check if List has unique permissions
$HasUniquePermissions = Get-PnPProperty -ClientObject $List -Property HasUniqueRoleAssignments
If($HasUniquePermissions -eq $True)
{
#Call the function to check permissions
Get-PnPPermissions -Object $List
}
}
}
}
}
#Function to Get Webs's Permissions from given URL
Function Get-PnPWebPermission([Microsoft.SharePoint.Client.Web]$Web)
{
#Call the function to Get permissions of the web
Write-host -f Yellow "Getting Permissions of the Web: $($Web.URL)..."
Get-PnPPermissions -Object $Web
#Get List Permissions
Write-host -f Yellow "`t Getting Permissions of Lists and Libraries..."
Get-PnPListPermission($Web)
#Recursively get permissions from all sub-webs based on the "Recursive" Switch
If($Recursive)
{
#Get Subwebs of the Web
$Subwebs = Get-PnPProperty -ClientObject $Web -Property Webs
#Iterate through each subsite in the current web
Foreach ($Subweb in $web.Webs)
{
#Get Webs with Unique Permissions or Inherited Permissions based on 'IncludeInheritedPermissions' switch
If($IncludeInheritedPermissions)
{
Get-PnPWebPermission($Subweb)
}
Else
{
#Check if the Web has unique permissions
$HasUniquePermissions = Get-PnPProperty -ClientObject $SubWeb -Property HasUniqueRoleAssignments
#Get the Web's Permissions
If($HasUniquePermissions -eq $true)
{
#Call the function recursively
Get-PnPWebPermission($Subweb)
}
}
}
}
}
#Call the function with RootWeb to get site collection permissions
Get-PnPWebPermission $Web
Write-host -f Green "`n*** Site Permission Report Generated Successfully!***"
}
Catch {
write-host -f Red "Error Generating Site Permission Report!" $_.Exception.Message
}
}
Function Get-Folder($initialDirectory="")
{
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")|Out-Null
$foldername = New-Object System.Windows.Forms.FolderBrowserDialog
$foldername.Description = "Select a folder"
$foldername.rootfolder = "MyComputer"
$foldername.SelectedPath = $initialDirectory
if($foldername.ShowDialog() -eq "OK")
{
$folder += $foldername.SelectedPath
}
return $folder
}
$destinationFolder = Get-Folder
foreach ($site in $csvSPfile)
{
#Call the function to generate permission report
$siteName = $site.SiteName
Write-Host $siteName
$siteURLin = $site.URL
Write-Host $siteURLin
Generate-PnPSitePermissionRpt -SiteURL $siteURLin -ReportFile "$destinationFolder\$siteName.csv" -Recursive
}