Compare commits

...

47 Commits

Author SHA1 Message Date
0ca671b477 Modification de l'ingestion des CSV pour ne pas avoir a modifier le CSV pour qu'il fonctionne dans le script 2025-07-31 15:10:50 +02:00
b6254903ca Merge branch 'main' of https://git.azuze.fr/kawa/ps-scripts 2025-07-17 15:22:29 +02:00
1d78d5367e Modif de l'ingest des CSV pour pas que le nom des headers pose probleme 2025-07-17 15:21:39 +02:00
d650d775ef Update Sharepoint/SP-keep-lastNVersions.ps1 2025-04-28 12:03:04 +02:00
ebf00f110f Merge branch 'main' of https://git.azuze.fr/kawa/ps-scripts 2025-02-19 17:01:51 +01:00
0b350b268d Cleanup 2025-02-19 17:01:40 +01:00
2e037fe448 Removed , ; from charset to avoid csv conflicts 2025-02-05 11:34:03 +01:00
ee7d0499e2 Removed Write-Color dependency 2025-02-04 14:32:59 +01:00
be0e6f7c4e Fixed Tech-N2 not getting his script set because of a typo 2025-02-04 14:21:07 +01:00
b8bd6bd142 AdUsers : Now adds login scripts to launch relevant admin panels. Sharepoint_Export : added a new mass export version 2025-02-03 16:09:31 +01:00
1018c693fd Push 2025-01-24 13:37:24 +01:00
3a68df44b9 Changed groups SID for DHCP users and admins 2025-01-24 13:36:47 +01:00
93c5060848 Removed accents 2025-01-24 10:47:38 +01:00
07bf2c14ce Removed Continue in loop 2025-01-03 14:58:24 +01:00
f308f5e804 Prompt modification for when a user already exists. 2025-01-03 14:51:17 +01:00
826c49d164 Error handling and check if user exists 2025-01-03 14:26:45 +01:00
7df974133a Remove potential escape char from charset 2025-01-03 14:10:03 +01:00
e7d688f972 Change group assignment 2025-01-03 12:50:02 +01:00
842a474a80 Commit & Push test 2025-01-03 12:25:12 +01:00
7285578906 Added new permissions and groups SIDs 2025-01-03 10:32:26 +01:00
67f3e3a4fa Added comments 2025-01-02 17:37:42 +01:00
5de0e4613d Misc text added 2025-01-02 17:20:30 +01:00
1ea4f9e09c Now exports users to a csv file 2025-01-02 17:18:15 +01:00
74d891415f Renaming to match what the script does 2025-01-02 16:58:43 +01:00
15a7637596 Almost completely done 2025-01-02 16:56:26 +01:00
ec5cb7dc4a Typo fix 2024-12-31 16:53:02 +01:00
9409e59f57 Add basic user add / group add mechanisms 2024-12-31 16:52:09 +01:00
Kawawete
8ee990cca2 Add functions 2024-11-27 17:59:24 +01:00
Kawawete
d6982c4927 Command output now goes into variable $RdString 2024-11-27 17:49:06 +01:00
Kawawete
bc97219e5e Add script that generates random strings, useful for passwords 2024-11-27 17:44:55 +01:00
Kawawete
eadda6107c Mod 2024-10-17 11:02:49 +02:00
Kawawete
2dd5bd9217 Start of the Multi-Thread template project 2024-10-17 09:36:15 +02:00
Kawawete
09d5e0f281 Merge branch 'main' of https://git.azuze.fr/kawa/ps-scripts 2024-10-17 09:33:53 +02:00
Kawawete
9c7533edb0 Update 2024-10-17 09:32:16 +02:00
66bd96e180 Stuff 2024-03-13 23:24:47 +01:00
5614dcb11c Chqnged threading stuff, back to jobs 2024-03-13 23:11:49 +01:00
Kawawete
7824d55859 Undo Test 2024-03-13 17:47:01 +01:00
Kawawete
5f11213de5 Test 2024-03-13 17:46:32 +01:00
Kawawete
a42c3bf5ef Tried to integrate Threading, as by default, a lot of functionnality will hang the GUI 2024-03-13 17:41:33 +01:00
Kawawete
a66fb59b6e Merge branch 'main' of https://git.azuze.fr/kawa/ps-scripts 2024-03-13 09:58:15 +01:00
Kawawete
f3634db543 Sync 2024-03-13 09:58:06 +01:00
f401ceb825 Add functionnality to Move button 2024-03-12 23:12:30 +01:00
Kawawete
f120caa0e2 List sites now works; Connection label now fully works; The URL field auto-populates with the last know valid PnPOnline session. 2024-03-12 17:05:25 +01:00
993825bea5 Added stuff 2024-03-11 23:58:54 +01:00
8b50ddb79c Add Add_CLick function for the connexion button 2024-03-09 16:16:00 +01:00
Kawawete
54ee71c7f2 Merge branch 'main' of https://git.azuze.fr/kawa/ps-scripts 2024-03-08 17:10:44 +01:00
Kawawete
3e6e4102ee Add new tabs (yay more work for me) 2024-03-08 17:07:29 +01:00
19 changed files with 2053 additions and 200 deletions

View File

@@ -0,0 +1,124 @@
Import-Module ActiveDirectory
#On récupere le nom de la forest pour déposer les scripts au bon endroit
$domainInfos = Get-ADDomain
$forestName = $domainInfos.Forest
#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
Set-Content "C:\techLogins-$pcName.csv" -Value "Username,Password"
########### Fonctions ###########
function GenPass { #Genere un mdp aléatoire selon les parametres indiqués
$TokenSet = @{
U = [Char[]]'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
L = [Char[]]'abcdefghijklmnopqrstuvwxyz'
N = [Char[]]'0123456789'
S = [Char[]]'!"#$%&()*+-.:<=>?@[]^_`{}~'
}
$Upper = Get-Random -Count 5 -InputObject $TokenSet.U
$Lower = Get-Random -Count 5 -InputObject $TokenSet.L
$Number = Get-Random -Count 5 -InputObject $TokenSet.N
$Special = Get-Random -Count 5 -InputObject $TokenSet.S
$StringSet = $Upper + $Lower + $Number + $Special
$RdString = (Get-Random -Count 15 -InputObject $StringSet) -join ''
return $RdString
}
function GetADSID { #On récupere le SID de l'AD pour pouvoir l'intégrer aux groupes qui en ont besoin
$fullSID = (Get-ADDomain).DomainSID.Value
$domaineSID = $fullSID.split("-",5)[-1]
return $domaineSID
}
########### Variables ###########
$userList = "Tech-N1","Tech-N2","Tech-N3"
# On récupère le SID du serveur car certains SID de groupes en ont besoin
$domaineSID = (GetADSID)
# On utilise le SID des groupes au lieu de leur noms familliers car Microsoft les traduit dans la langue cible du serveur
$grpAccountOp = "S-1-5-32-548"
$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 = "Administrateurs DHCP"
$grpDHCPuser = "Utilisateurs DHCP"
$grpGPOadmin = "S-1-5-21-$domaineSID-520"
$grpNetAdmin = "S-1-5-32-556"
#################################
########### Script ############
#Pour chaque user, on le crée + ajoute aux bons groupes
ForEach($user in $userList){
try{
# 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-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
$detailsUser = @{
Name = $user
AccountPassword = $userEncPass
Enabled = $true
ChangePasswordAtLogon = $false
PasswordNeverExpires = $true #On fait en sorte qu'il n'expire pas
}
New-ADUser @detailsUser #On cree l'user...
#...puis on l'ajoute aux bons groupes
switch ($user) {
"Tech-N1"{$Groups = @($grpAccountOp,$grpPrintOp,$grpDHCPuser)}
"Tech-N2"{$Groups = @($grpAccountOp,$grpPrintOp,$grpGPOadmin,$grpNetAdmin,$grpDHCPadm)}
"Tech-N3"{$Groups = @($grpDomainAdm)}
Default {}
}
$newCsvLine = @([PSCustomObject]@{Username = $user; Password = $userPass})
$newCsvLine | Export-CSV "C:\techLogins-$pcName.csv" -Append -NoTypeInformation -Encoding UTF8
ForEach ($Group in $Groups) {
Add-ADPrincipalGroupMembership $User -MemberOf $Group
}
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 : $_"
}
}
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

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" />
<supportedRuntime version="v2.0" />
</startup>
<appSettings>
<add key="EnableWindowsFormsHighDpiAutoResizing" value="true"/>
</appSettings>
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.BlockLongPaths=false;Switch.System.IO.UseLegacyPathHandling=false"/>
</runtime>
</configuration>

17
Intune/Random-PWGen.ps1 Normal file
View File

@@ -0,0 +1,17 @@
$TokenSet = @{
U = [Char[]]'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
L = [Char[]]'abcdefghijklmnopqrstuvwxyz'
N = [Char[]]'0123456789'
S = [Char[]]'!"#$%&''()*+,-./:;<=>?@[\]^_`{|}~'
}
$Upper = Get-Random -Count 5 -InputObject $TokenSet.U
$Lower = Get-Random -Count 5 -InputObject $TokenSet.L
$Number = Get-Random -Count 5 -InputObject $TokenSet.N
$Special = Get-Random -Count 5 -InputObject $TokenSet.S
$StringSet = $Upper + $Lower + $Number + $Special
$RdString = (Get-Random -Count 15 -InputObject $StringSet) -join ''
#You can use now $RdString in your script to make a random password to an AD user or other stuff...

View File

@@ -0,0 +1,7 @@
# This is a template for multi-threaded stuff, or at least it should be...
# We start a new job and store it in a variable to be able to display said job later by invoking the variable in the Receive-Job cmdlet.
$Job = Start-Job -ScriptBlock {Write-Output 'Hello World'}
Receive-Job $Job # Will display Hello World in the cmd

View File

@@ -0,0 +1,646 @@
<File version="3.2">
<FileID>27bdac5f-55ae-4908-a755-ee5f598a9689</FileID>
<Preview>iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAADyMSURBVHhe7d0HbFx3guf5vtnZwyywt3sH3B2w
ONwdcJjZnZvF3s4udnu6Z7p7OkyP293OoZ1tWVYOVrACrZxzlm3JkmzlLEoUlSiSoiTmnHMx50xW
YDHzd3iPTzL1KLclSyqaet8P8IVSFYum1P3/sapY/NGPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAIeI/NGPfuT6H//lv3T94uc/c02ePMU1ZcpU1xTjRyIiIvphN2Wqa+rUqa7X
Xn3V9a/+1V+4/uzP/sz1ox/9qMh+2I/w53/+5zV/9Vd/qfHjP9L+g8eUmlOi4soWFZY3ERER0Q+8
oopmFZY3KPxmrObNm6+//du/1V/8xV/Ift6P8C/+xZ+5xo8fr8joFCUX1utmRpluppfoZnopERER
/eArUVR6qeLzapSeX6Fly5br3/7bfzNgP+9H+Nk//INrz77DSilu0M20Et1KJyIiorFWVJpLiQV1
irydrJdfeum7B8DkyZNdqbllis4q1+2MUiIiIhqj3Uhzqazeo/XrN373AJg+fbqror5DtzPLdTuz
jIiIiMZoxkMBFU2dWrt23XcPgKlTprrKatsUk1WhmKxyIiKigBabXaG4nCeT8bbN28l8um7L/jG8
062MMlU0+rRmzdoHGwDltW2Kzak031kiIqJAFZdTad51fT2h4Il0I6XYvI07txWV6hpxmceV8Tj8
ndsyikwuGnGZx1F4YoGiM8vuua07GffmVzZ1avVjGQA5lYrLrX6wcqpGXp+IiOg+xedWmQf0sfPR
2n88XPtPROjAY2z/8Qh9feqGLt3MUmJ+ta7F5urgmajHfzsnIs33/3DwLYUnFCo+r0oXItL01anI
x35bRsZtnQyNMweH8TEc/jF9+AFQ16643CpzTdyT8XtZZYpJylR0UoZZjPFjSqFup5Todkqxbqe4
dDu1RDGpLsWk5d//7RAREdlKLqrTqSuJOhESo/SiGiXnVyk5v/KxlVpYrajEPO09Gq6UojodOHlD
V29lKq2wesRljVLyq5RSUP3tfev7V2W+/8HXknTkQowS8qq058g1xWa4zOuNvHylUgqG3Zb5du+9
7W/7WBiXNd7/g6dvKORGhpILa+/5mEZnVQwNgNUPMQDi86rNJXFPeTWKTcvX7Zh488fY1DzdTspX
wuWVyjj7W6Wfe0nJp19Q3LHf6+aRl3U7+pbi8+vveRsJeTVKLKgdKr9GCfbbICIiR2YcyicvJej8
tSTzbIhIKlJkSvFjy3hGfGxGib48Fm6ODWMA3Egs0K2M0hGXNS+f6tLV2FxdickZWWyubqS4zHss
7NeLSClWbFa5rtzM0OHz0eZ5uu9YuBJzK0Zc1rydFJcikovuvm3j17fShh4GuRKTrWtxeYpKcSky
edj1rJ+HJxUpOb9axy9E60JkujkAhn9MY7IrVdXsf/ABUFHXrgTjcM6rvrf8WsWlFygmOVNJxc1K
LGpSTHajks++KU/aBPVVf60e1wZ1583R7b3/XjduhCmxoHHY9asVl+XSzaRc3UjM1o3kQsXmVCvR
fjtEROS4Uovrdepyos6HJSupoEZRaY/3RehuZZYpNqNU+45HmLf11akocwDEZFeMuOztrArtOnBW
Cxdv1KJlm7Vo2ZZhbVbQko3atueE+SQ7o+HXHXoRnipduZVp3gNgfLJr3GZSbqVuprnM19i5k/F8
h7D4PK3fdkBLV25T0JJN2rjziI5dvK2FS7dowaL1WrFmp/afuGIe5lGpd67rMn9uPIchpaBGx0Ni
zHsAUorq7/mYxuZUqaq568EGgPEawhV1HXc/Qx9eUkGd4jMKFZ2apfiyJiWUNSkmr0Gxp96XN2eh
1HxCqlgjFX2kqzv/WpE3wpVU1GRdv04prkqFXb2ow4dP62RwiE5fvq2ozBpzsQy/V+Cb7vPru5e5
3+WJiGisluZq1OmrSboQlqzUwlrdzihXdObI7M90v6f7XP5O5vMMMsvMx+jTXA366vRN3UwqND9T
vvftVyg6s0ILFm9SdVWNNDgou5bmFi1cssm8B2Do8t9c33jcPSm/RtduZeloSKySCmrN2zTuxr+V
PjQYzB/TyxSbXamQG2maF7ROFeWV6u/r0/ZdBzRx+mLFxSVrcHBAp05d0IqNe5VQUGte57ZRhlGp
eU9BqnHPSUisQqIylVrccM/H1Lj3obrlgQfAFFdlfYf5MsDJBXX3lFLYoMTCGsXs26Fb419R2PiX
dX3TZkWemay2uBelkqlS5jNS0l8reP2/U/iNG0p1tVjXb1BaaYXCLl3S+cg8pZZ1KMPVqJTCOqUU
NZjv9N0fzd+rN3+eWlSvlMJvfn7396zLGivOGBD295WIiMZWGaXNOnM1WReuJ5uHWnSG9SV0w4rL
rlJ8TrX54/2Kz61WrPFl7LbrDV23QvFZZeZd/xklTTp45pZuJRcpMbdGsZmVd4vLqjJ/DFq6RT6f
TyWlFdp34LgOHTlj/piXV6SB/gF9umyLedf8ncvfKSbTeGy+zhwAx0LizDPMGACpBdXmsDAel/9m
bBhPuK/Urq+C9emSjaquqZPP16nk5AxzaFy5ekOzF67XpdsZ5mfzxvVjjKwv1Tc+Rumuep28GKvQ
qGylu5ru+ZganyjXtHQ/xABocCvV1WgersMz1llSZasiZ7wr1x9/pfz3X1bwS88r9PhklZ//P9QV
+x/ki/if1Rn2P+jYkn+t8BtRSi9tta7fqIzyKl2/clnB11IVl1elxLwqpRhvMz1VwcEXdfL0WZ2/
ka2kkibFJafq4vkrCr4SrYikVF29dlOhYRE6dTZU1+LzFRZ2RcdPB+vCzXylFDcqzfa+EhHR2Cqr
okVnw1IUEp6iDFeDYoyDNfubEgvqFXw9ScvW7FbQki1atGL7PS1cslmbPzuqm6mlSsirvee6RsY4
SMiu0IFTUcoqb9bBs7fNJ68b927HGaPCKj63RnE5Nebba25q0pEjZ/Th9GXae+yqJs9eo92ffS2v
16OgpZvNz8iHLv/N9Y2HtlOLGhQWna3jF+PNexuM0ZFWaFxu6Inx5lfa5VSad+sbz41LL2nW5s+P
a8Gn61RbW2ce/pcuh2vSjCW6FJ1pnsnGZc2vrjPehvHfZH2lXVZpo/lVAJduZyuzrPmej6nxXIfa
tp4HHwBVDW6llTSZ7/Tw0kublFLZoouzJqhk+vsqnfihDr36uq6dW6Kz6/5SZ9b/jU6u+WsdWflX
2rfsv+pWdLQyylqt6zcps6JWkWGhOnzwhE6cCdbZawmKKyjVpeBgXbhdpMSsbIWcv6grKaWKjo3Q
0aOXFZVVrYT0WB3Zf1KhcYWKibmuQ8eCdTmxVAkJt3T8xDVF5dcro6RxxPtLRERjp5zKVp29nqqQ
8FTz/9Njs785VI2MTyhXbz6g0ItXVV1do6qq6nsyfm/dhl06fSVeyYUN91zXyHwSek6lOQCyK1p0
8Ny3DwCjBUs2q7ioSJcuhWn2vFVatW635sxfrVNnQlRZWWE+P8B4mOLbB0COjocmKL2k0RoAtYo3
B4B1eFs/N24/OCxRsxesVWjoNdXUVCs3N0/l5WVau2GX1mz9SjFZZebd+UMDYtjbyK5UVmmTOQAu
R+eYI2r4xzSluF617Q85AIy7Yox3engZZS1Kr27XqRkTder/+l91+H/7X7T9n36la0l5OhSWocNh
aTp4NV2hkUmKT0xVbGLqsLfTrKzKGkVcvaKQyByllrWaby8jN0NnT11XVGGDcmt8ir19RaHxebod
c1vBoQlKrnYrOS1e585FKa7crYyCDAWfvqZbRR3KLitSyJlQhWfWKbOsacT7S0REY6fcqjadu56m
kIhvGQBlrVq2fo8uhV6Rx92mhvq6e3K7W7V6zTaduBSr5KJvGwAVOnA6SjlVbTpkDIDUYvOucuNh
hTsl5BpfoVarT4LWKzsrS40NdaqpqVJVVYX5Y319rYqLCvXJwrXmADAuP/z6xm2lWQPgxKUEZZQ2
DQ2AolrzfRheUmG9IpMKNXfhWoVdC1dHe4sOfH1cM+csV3p6hhrqa7Vu/U5t33tK6aXNI65vjI/s
smZzAFyJzjVH1PCPqXHPQV1774MPgOpGj7LKW827EoaXVdGmNFedrh4+qKPz5ujA/HkK+Wy7vrye
r9XX/Fp7tUcfHmjRnuAE5RSVKT4lQ5nlLdb1W5VTXauIK5cVciNX6ZUd5tvLcuXrwunzupZWq5zy
aoVduqqwjFLFxN3SuYsJSjEHQJzOnb1hDYB0BZ8yBkC7sssKFHIqVOFZDeaas7+/REQ0dsqv6dD5
iHRdjEhTVlmzebgNP+zSSlu07/hlBS1aq7Xrtmv12ntbs3abgpZuMp9Vb3xHW/thaTwZz3gm/ten
byqvpkOHg6MVk+Yyn1NmPGRwJ+NJ5sY9COu3f62lyzeat7V2/Q6tXbfD/HHNuh1asWKTVhlPzDOf
rF53z/Xj82rNx+Kvx+Tq5OVEZZW3mF9xkFFcb353PuMz/jsZD48bz+RfvHyrNm3erRUrN2vJ6t36
4kioPlm4Whs37dLylZu1a/9ZZZa13XNdI+O2cytadepSvK7G5imvuv2ej6kxGuo7+rRq9ZoHGACT
hwZAtnE4l7fcU3Zlu1JyS5SYla/cJr9SCl3KKyvXhqOxmnvErdmH+vSPCyq1YX+E8kvLFZ+SqayK
Vuv6bcqtqdfNiAhdvl2ojKoOZZe3KruyWUkpsTpz5oJOGo/p38hWWnWbEhJjFXI1RanVHqVmJivk
YqwSKzzKLMpWaEiUYoo7lFPu0uWQcEXlDt11ZH9/iYho7FRQ69aFyAyFRqYru7xFCXlDB9ydkgrq
zc+uz11P1vGQaJ0IjbmnYyHR5qv7GZczGn5dI+PJ7Sl5VeaT//Jr3TpyPkYxaSXmIWy/rHH9W+ml
OnkpTscv3ns7dzKeAHi/20nIr1NGSbPCY3N16kqSsita9fXpKGWVGE92bzQHxz0VNyoysVAnLsXo
1OU4RWeUKa20WZduZer4xdsKvp5sPn/BuJx5+cJvrmsMlfyqNp2+lKBrcfnmiBr+MTXuaW9w92nV
qgcdAE1e5VS2m+/08HKqOpSaV6bYxBSlFVQqJj5J6VnZ2n4wQm8vv6F3loTrxblX9dmh68rIylJc
YuqIt2OsOuOd+ub32pRT1aoMV635rM9M49eVbcouH1ovxp/f8/OKlqG3YV53+M+JiGgsV1jnMQfA
5ahM5VW1K6mwUclFwyo0npzerMzydmVVdJg/Ds/4vYzSVvOQved6VqmuZqUX1pkDoKDOYw6A+Mxy
ZZS2jLisUVpJy9DbHnFbHebvGX9uv86dssvbdCO+QKevJJlnmnGvQ25ZszUAbBlPki8zPgYdyqrs
UHppizlKMsvblG3eW96hNFeLeblU6zrmj8XGx6RBBTUdOnslUWFxBeaIGv4xzSxvVYO7/8EHQE2T
V7k1HeZjJMPLre5QVmmDEtNzzJIy8pSYnqvUrDylZ+eaZeTmKTUrXwlp2UrNdSm3atjbqWw3f51b
1W5+QIZ+r838tfG286q/+TPz94zu/vnQz3OsyxqPFX3z82Fvj4iIxmRF9V5djMpSyPVUlTd1ylXv
lavu8VXa0KnU/GpzABQ1+HT0Qqx5D0CZcVv3ufz3rt5rvv/Xo3N09lqKebYZDwHkljXJVe9TcZ1n
RK77/N6DZNxeWaPPfA5AeEKRCuu893xMjU+cGz0PNQB8yq/xKK+qY2TVbuXX+pRf671bQa1vROZl
arwjr09ERHSfCmo85rPnT4Um6mhwjE5ejNOJkMdZrI6ci9aNJJcK672KTq8wb+f4hdj7XPb7Z7zf
x87HmD83nkxYWOvVtZh8HT53Wyfvc/lHybito+eizaGRWdJsfgyHf0xzKzvU5Bl8sAEw2RgAzcYh
7lW+cdgTEREFKOOwNB4/jzVeA+CxV6nEvDrzkDRuy/gxuaDe/P2Rl3300oobzf+e/Bq38qrc5lcL
2C/zuMoqa1Vh7dB/1/CMT9qbvA87AOqG3mmjAuOdr3Yrt9rziBlvg4gcURU5rZzHVF6NRwV1Q5+I
Pu6Me62Nf5/Gc9qM93noXuwnkHmGGnfHW7dlHMj2yzzGjI/Z3f8m6+w2h0fNwwyASZNdtc0+FRof
fOMvwVxKHpU3eFTb7FZN0/evttl4GxTo6lq8jq2+1efc2ka3hrbO0avduTW2+0etpo7RrsuxNbu7
1OLuVn2bXwXVQ2e3eX7XeNTslVauXP39BkBetUf1LW75PB3yuL9/Xo971PJ5PY6t0+cd1fydvlGr
y9/p2Hq6/KNab0/XqNXX2+3Y+vt6R62B/r5RbXCg37FpcEDSoLp6+sxP2h/rAKhrdpuHeEfH98/t
do9aHo/HsXm93lHN+GYao1VnZ6dj8/v9o1pXV9eo1d3d7dh6enpGrd7e3lGtr6/PsfX3G0NgQJ1d
vQwAe/ZD0UnZD+RAZz+UA5n9UHRS9gM50NkP5UBmPxSdlP1QDmT2AznQ2Q/FsZjx7YAl47N5u0EN
9PePuPzd6zEAvj37oeik7AdyoLMfyoHMfig6KfuBHOjsh3Igsx+KTsp+KAcy+4Ec6OyH4ljLvCtf
AyqoalVwXKkORxaanbjlUlJhg7q6e8w/7+8feV0GwJ/Ifig6KfuBHOjsh3Igsx+KTsp+IAc6+6Ec
yOyHopOyH8qBzH4gBzr7oThWMg/0/j7Vt3p1JsalGXvj9NulV/XT+Rf1k3kX9Yugy/pwx23tvZqn
svqOb65zz9tgAHxr9kPRSdkP5EBnP5QDmf1QdFL2AznQ2Q/lQGY/FJ2U/VAOZPYDOdDZD9axknF4
17X6tPdqvv556VXz0P/ZwtB7+vsFofrVostaejRFhdVt6u0derhg+NtgAHxL9kPRSdkP5EBnP5QD
mf1QdFL2AznQ2Q/lQGY/FJ2U/VAOZPYDOdDZD9axkHG3v3GQH4wo1DPLrpmH/88XXtIvgu7t50GX
9PfzQ80/X348VU3tnebDAXfeDgPgT2Q/FJ2U/UAOdPZDOZDZD0UnZT+QA539UA5k9kPRSdkP5UBm
P5ADnf1w/aFnPuFvsF+ZZS0at+O2fjw3ZMTBb+8nn4TomWVXdTm5Ul09xpdeDj0xkAHwJ7Ifik7K
fiAHOvuhHMjsh6KTsh/Igc5+KAcy+6HopOyHciCzH8iBzn7A/tAzHsc3BsBnV/L026XXzLv67Qe+
vTuXCTqUZL7Y2Z17ARgAfyL7oeik7AdyoLMfyoHMfig6KfuBHOjsh3Igsx+KTsp+KAcy+4Ec6OwH
7A8949A2BsCSY6n66fzQ+971f7+MhwHe2xql0roO88sD77wtBsC3ZD8UnZT9QA509kM5kNkPRSdl
P5ADnf1QDmT2Q9FJ2Q/lQGY/kAOd/YD9oXdnACw+mqa/e8gB8OamSJXWtTMAHiT7oeik7AdyoLMf
yoHMfig6KfuBHOjsh3Igsx+KTsp+KAcy+4Ec6OwH7A89cwAM9Gvp8TTzCX4POgCMLw98f9tN80sC
GQAPkP1QdFL2AznQ2Q/lQGY/FJ2U/UAOdPZDOZDZD0UnZT+UA5n9QA509gP2h575HICBfh26Uaw/
rLquf1jwAM8BWBCqXy66rDVnMtTY7uM5AA+S/VB0UvYDOdDZD+VAZj8UnZT9QA509kM5kNkPRSdl
P5QDmf1ADnT2A3YsZDwEYHwmP2tfgv7e+BLA+xz6w/vJvBC9vDZc0bl16rUOfuPtMAD+RPZD0UnZ
D+RAZz+UA5n9UHRS9gM50NkP5UBmPxSdlP1QDmT2AznQ2Q/XsdCd72IYllql19ZH6L/PvXDfrwb4
+cJQ/eQT4zUCQrU/rEBuX5f5HQDvvB0GwJ/Ifig6KfuBHOjsh3Igsx+KTsp+IAc6+6EcyOyHopOy
H8qBzH4gBzr74TpWMr6W39PZrZDEcr26PsJ81T/j4QDjeQHG4/3Gj8avf78iTHuu5qmp3cdLAT9M
9kPRSdkP5EBnP5QDmf1QdFL2AznQ2Q/lQGY/FJ2U/VAOZPYDOdDZD9axkvGCQMaB7u7sMr/pz/qz
Wfrjpig9szzMfHXA59eEa+HhFF1NrVSrxz/i8DffBgPg27Mfik7KfiAHOvuhHMjsh6KTsh/Igc5+
KAcy+6HopOyHciCzH8iBzn4ojrUGrO8GWNviU2JRg25l15rF5tWrpK7DfMzfeM6A/XpGDIA/kf1Q
dFL2AznQ2Q/lQGY/FJ2U/UAOdPZDOZDZD0UnZT+UA5n9QA509kNxrGY8tm98ed83jJ/f/9sA34kB
8CeyH4pOyn4gBzr7oRzI7Ieik7IfyIHOfigHMvuh6KTsh3Igsx/Igc5+KDopBsCfyH4oOin7gRzo
7IdyILMfik7KfiAHOvvBFMjsB5OTsh+Kgcx+KAU64xB0agMDA9LgoPzdfT/MATCa2QcBBS77IKHA
ZB9iTso+BCkw2UcoBS5jdHd1+dXh6TQPfQYAEY1a7e3tRBTAOjra1dTazgAgIiJyUm53h5rbOhgA
RERETooBQERE5MAYAERERA6MAUBEROTAGADfK7c8Xo/5wRv5Zw+Q9aVubuvXQ1/65h55OSIioicU
A+B7ZBzWbW3t5sFt/7MHzePxyuf1jPh9IiKiQMQAeMjc/n65U4/rzd+/qe3R1ery++5+Jv/dudXp
96k08jO9/dzHulzqk3o7lBF2QIvXXVRTj1/eEdchIiJ6/DEAHiq3/IMDSvlspT764GWN2xIvt79L
fcZrKlvfgmGgu1Nud6f6zW/OMKTH51WH+aILbvm7OlUauUH//n/6a723OVSe/gGlntugcTOPqGFw
4Jtv5zDYLZ/XZ77toV8PmC9daXyThx6fW+1un3ru3ERfl7wd7Wof8f4SERHdPwbAw+T2a6DLpS83
fKZTly7py1VblVFfrvDzp7V98XRNnPyx9sfkqK0tV0f37tWGeRM1ce4ahZfXqbOrU25jAPg9yrv5
taa+M0dzPl2p8yn1yr2+U5MXBqutMU1Hl32sqdOma+lnN+SqKta5Y0e0fvV8zdv5lU6fOayFn+5Q
RHGLBnylCvs6SNOmTdPa8wmq9fWq022MjPu830RERLYYAA+Rp3tQ3qyTWrx2g65GF+jcrgXaFXZF
S198X+/O2a3DOxbqxdlBOnZ+r17/8Yda8sVxfbH4fT27fI+KG73yez3mAMi5/rlmLTquK0e3auWO
c4q8uE/Tg87J7S/XjaN7tGNjkN56Z6F27tmht3/zmpZ8tlkfPv97ffDJNq1ZtkBztl1RzInVmj1z
mjZtXa53P5qpLWey1NnfJc993m8iIiJ7DIAHzqOewW5lnFunZ//zf9E///4P+tl/+7WmLF2toPkb
dD7NLalS24OWaOXqFZo6a59cvZKawjTh3eWKLGgwH/8fGgC7NXH2KTX1FOngslVatXqJPl5+XuWu
6/p84Ry99daL+umPX9CSTes0feYuFTcX68DSxdp5Nl1FiUc1f94GLX//Wf3N3z2jP77zhp77p3/W
gi8i1NjdJ99T9TEnIqInFQPgAXN7/Rpoz9eetXO18lCGegf6VRV3QeumP6NfPrdSJxN8kgq0ZM5s
rdy4TpM/2KW0TkllJ/TKe0sUXdws/90BsEsfzfxa9ZJqo9fpZ//pp3pv9RfaNXGKPl1xU1Kjdixc
rKC1qzXjky9VVJuhXUtXaM+FdGVG7dMni3Zqw6S3tGDzNQ1qUMVJ0YpOLpH7oZ6QSERETo4B8EC5
5evqUn1aqJZOn6aQsh4NGk/I8xTpy09+qX/9b/4/vfHem3r35Vf09sqDSk4+qfd/9Tu9N+4Dvf7c
HzXnUISaPZ3yuYceAsi+tkPjpn2l6t4+9ftcWv3c3+kfgw4p5sg+jf/NHzXhnZf1n//uHX28eZ1m
zPpCBTXp2rFoiXafS1VG+G5NDjqn4rRjWvDH3+rdd/6ol2at05mEGnX1MACIiOjBYgA8YG6PW821
5SrILlCTxzhoh0ZBa9ZJvfHiO9r05Ve6cCVCBbWdas8/qjffmK1TIWd04WqS6ts71ekb+pp/4wPe
VFuqnLxytRrfg93tVV15jlILauVpr1Pa9RCdPxes8NgMFZa6lJdfpubWRpUWFqq0qlGNxnXzq+Tv
7pQrPVJnz57TjZxKdfiNx/95EiARET1YDICHyO3xyd/1zUHb7unSoDdPB3Yc1K2C1qGvyOvpUn3u
Fa3bEKyqrgFpoFc+41X+2r95Ox5vp7q6hj5bN750z+fvVo/fa7797v5+9Q8MqL+3W/5O43LGlxV6
1On3myPCvK7fN/Qlhd19GhgYUF9XJ4c/ERE9VAyAR8r42nvjcO6Ud/gh7/aaj/dzd/yTzXglRiIi
J2T//7/HEQPgMXS/v5zv/X0C6IFrb29Xa2srEdFTnfH/dfb//3scMQC+I+MD3+nvufP6fOZd7gMD
d1+vT4Pmr787O/ufP60Z3/Tocf/jNd5mY2OjwiNv69btON2Kjicieiq7eStOETduq6m52fz/Pvv/
Hz5KDIDvyLiLv9ffoMybYQrLqrl7gFdnRetWaqmML/V/EP0dBTp7YL/2nwpWcds3A+Jp96QGQHV1
jaJjEsyXRyYiepozhkBdXT0DINC1e3qkjmiN/9V/0F++8IW6jFOtz6WP/9v/rv/zua0yXv7nu/R4
inR41lSNmzFf84Pe00cTDqrYP/JegafRkxwAcfHJ9psDgKdOTFwSA2A0avd0S23RWjBxjqaMm6U4
48V9qs7qrZd/o9+897Uaentkfbse9fd3qvfOL4ZpzT2qD15dr0br10Vx2ar1dam3b2gEDPb3qbe3
T30DffK7W9TY1KzOu29nQL72RjU2tat76NLq6elSe2uHfD32GxtUX2eHmhsb1djstu6d6Fd3Z4da
mhrV7h+6fF+/8X0DmtXY1CLjCxWeJAYAADwaBsAoZQ6A1tta+fFa7di0QOtjWlQe8oXWb16gGZOX
a+aihdof59Vgd7EOLpmu67X2vzqptzVbX8x8Qau2HVVEVJaMZxQkn9+nDftTzD8viTmlTZv264ut
6zTuxRf0u2d+pbe2H1a1v1/+9ENaMfttvfvRNG0Iy1V+wklNeHuc3njnU51Itt9YryoubtXkt9/W
269N1bbgLEWd3av3nn9Drz3/O/3znPXK7CjWwRXL9P5Lz+l3//xrfbDnlOq6ntxDEgwAAHg0DIBR
yhwALbe0YsFmHTh4UNvXbNKOz/fp1N6dWrbuiA6tmqtVn4WoIC9EEz7Yr/pvOUv7qxK0fek0vfzM
7zT9wCWd/XqrFm2PNf+sIHy/Pl20USumLtSa4+Xq8xVr5aI52hp8XTve/o3+OGuV1q2eon/48ata
vGKB3n5ljVwtXRoYHHljfS0ZOrRrh1bOe08vjV+lz1cv1uSgSHn7enTxi4Was2OfNk1YqM0X69Xn
ztL8uTP1WZTxosRPBgMAAB4NA2CUGhoAUVo8b7eiEtJ0aspP9Pyyr3U7/KwWLr+mdtdJzVq1TluW
f6otcVX2v7eR+pM044UZWrJhpVbuSTN/q+TmQS1dtEmr12zThVSPpG4F79ymzRvW6t2/f16TV2zQ
1q3btXvXIR07uE1zVl2/+7DDcJ1NKfpy4jQtX7NbW5dP0GvjV2r3Z5u1+Wi++ecFYV9rSdB6LVuz
U9fzjQcUPDq0eo12nh368yeBAQAAj4YBMEqZTwJsjtDsSZuUUlWpa+tn65Mtt1VeEqyJU4+od7BV
n6/4vf7jb2cNffe/+3BFbNfEnV8q0+VS+q19emf6Rh3ev0sz3t2rZFeFQr9YovkLNmntzPlauCNa
rtxIzZk3V1+Ex+v4x2/qi/M56ujI1fHjVxR8eKOmLjwvv/1GJLW7QjXlv8zTtcoWVVzZq2c/WK7d
axfpw2nHlVdSrD3r5mrxwRPaNXGuluxPlivzsibPmq2DCS32N/XYMAAA4NEwAEapdrfxXQBTtW/n
KWXXd6q/p1+9Pf3qKIvQ9t0RMu6Ez9j7nsbvOC//yHvkh3QX69CKqXruhRf0hw9mKTjfp35PqXbP
eUV/eGGiFn+6XYcOndKWNdM17pXf6oXn39CSY0nqGZR6SyK0dPzv9cLr47U5Ik/5qdf0+Vex5vMI
7id512q9+eILeve98Zq0/riOHVyut5//nd5+9QW9v+aSfH0l2rZgvD549Rm98Pw7WnsuQz1P8ImA
DAAAeDQMgFHKOLy6ur/lU3t1Kf7cCv3h3SDF1Bp33Q+q9OYZrV2yREvu9oUSqowvHfguLq2ZtUxH
ox/08fgORX+9c9jtLNGqjSG692mBPl3YuVJLPk8d9nvZWjJ9uYJTh753wZPGAACAR8MAGMU8HuO1
/f3q7Owcll/+zmbFhezXnkvJ6vB3q7PTq8JbF7Rz40ZtvNtBxbkazevfzXob9/yev0Fp8SkqqGy1
fj3sdu5e5ptfd3Y2KObYvmG3s1HbdofK5R7+djvkykpVSnbN3d/r9NUpJS5VxTXtttt5Mt3vZZIf
NQYAACdhAIxixmew98+trj7jiX3dchvfGKi9Xb5u4zeGG1SX132f69rzqKunW50PdFkjt7pH3HXf
J6/1fgzVoc6ubnX7vffcTvdD3c6jZf9YPo4YAACchAFAZMUAAOAkDAAiKwYAACdhABBZMQAAOAkD
gMiKAQDASRgARFYMAABOwgAgsmIAAHASBgCRFQMAgJMwAIisGAAAnIQBQGTFAADgJAwAIisGAAAn
YQAQWTEAADgJA2DUa1eH26veEd/yd1BdPuN19e2XfzwZb9fX1a3e/i65zdfX75Cvu0c9vZ3yuP32
d0Y9nR1q7/Cpt6/HfL3/jif0fo1mDAAATsIAGOU8Xr/cdcU6sWmSJk2aqhmzZ2ralMmatHCLbuQ3
qsfvHXGdh87tVVe3X967Hze3OrvbVRR7Q6Gn4tXQ3a3u7lbl3riuq6EZqm9M1q6gWZoyyXifJmnq
7G0KK/Srp6NQF05fUUZpg7y+x/sP5ocQAwCAkzAARjm3x6eOpipFX/xaBw4s1R/+719pyqrtOnD6
sjIr2tXfP6D+/j71dHrldnvl7+pSd0+v+XvdncZfmlverh719ferv69bPq9bvk6/urp71NfXr77+
AfU0JWr39lPKqWlTp3lwe9SrNt38bJ0+fmuvys1/Cs26um6ZFs48rbziI3rh5+9o074DOnTwgBZO
eU8fLbomd9stTX93gc4mVsjf4xvx3zLWYwAAcBIGwKg39BBAT7/x15Gnzc8t1bXSdvMvp7+rSXmJ
13Tx4lUllTaqw92o4vw8ZcSG6+LlG8qqdMvvaVVZ6k2FXgzV5fAUVbV0qLqiRPnpiboaeklRGdWq
SDmo5/7xbe28nKkOv0/uDo961KaY/dsUNPGgKsxba1b4tvVasTBYOYWnNOOTM+qx/pG0ZR3W5Gc3
qrgtVkFTVigkpVL+bgYAAIxlDIAfSG63Xz5folY/M1/nMqvUPdCr0oh9Wjn/Xc2Y/pE+2nBSkeGH
9N5vX9a4SeP17rO/1pvzglXd1KCUw6s1bepkvf3WTG06fFW7Fk7U879/S++/8YKee3mOli+arZ/8
v/9Vb60OUaPfeCjA+ycGwHkVlp7S6798XUFr1mrjxo2aHfSx1n4RI29bjOZPZgAAwNOAAfADafgA
CM6u12BfiTa+9gv9+Hdva/ascfqH//T3mjB7ll5/fZki6wakhsua9vYSRZdUqiz5vJbNmaP3X/2t
Xp+6XKvnztTcnTGS3Lq4cbGWr1qrTxZ9rqTyVvk7jecUGPcAtCp63zYFTTisSvOfQosit23QigXB
5gB47ecvafaylVo+a5ye/cVr+jqtR2q7rU8mL2cAAMBTgAHwA+meAZDTKPlTNf/Xv9NHy/cr/GaE
Lp67qKvnduijGfvk8vSpu+qa5ny8QceP7tD852bq6KVIHd30icbPXKmVK9foy5BCSQ06uXOjVixf
qRmf7FJiZZu6zQHgVteAX5lndmrBjDUqML8CoUWntixV0JYoVeaf0JSPD6vZ/CfSraQDn+qPG6M1
0BateVPXKrygzfyTwf4e+TxDX1Fg/+8ZizEAADgJA+AH0tAAiNOin07XifQq9Q96Fb5lsmZOX6qr
l45p5ab9Onpwi94fv1XZbb3qqbioSR8t08H9n2vKL+Zqb+g1bft4kn794UJ9ujBIm49nS6rT4XXL
FLRitWZ/NEEbv45SfafxZX4d8nb1qzH7kjaueEO7T19TeOhRTV25WJ9HV6ktdZ/eeHe7Cju86unt
VlX6aU17drkyG2M0++W3NHfdHp08dVxHLt5USV370JcF3ue/aazFAADgJAyAH0jGM/w9nmJd2nVW
yWX18vq71NVcppNbZ2rcuAlaF5qmioo0HT8aror2Tvka0nXiWJiKyip1a+86TR43Th8vXK1dp67o
cuglRSZVqLu7WQnXL+tSdKxuHl6moMWHVej1yec2Dmy3/L2dKk6/oi0rF2jBkjU6HJ4sX3+PGgpv
6/DRKNV0eOTzedVSnasrR08rr65UF7Yt0kcffqhx48Zp3KLPlVzWph7zqxFG/jeNtRgAAJyEAfCD
yquewV75vcYLALWrw+NTn/UCQYM9nfJ6/err65ano13t7k7z5z6vV10D3/yFDvb1qKenR91+j9rb
3fIbL+5jfOlgn/GnvfIa17Vuz3zxH3+PBszbGFRft998USC3t0t9fV3yWJcxvlSxp69XvhEvWNSv
Th4CAIAxiQEwihkf9M7OTnV2+ughc5v3Yoz8mD5KDAAATsIAGKWMD7jxgc/NK6CHKbdAhUUutba2
PvYRwAAA4CQMgFHK7+9UUnK6bt6KU3ZOPj1gWdn5uhp2Q5WV1fJ6H8PLJA+LAQDASRgAo5S/0xgA
aaqtq7f/neA7JKdmqKyskgEAAI+AATBK3RkAFZXV9r8TfIfE5DSVlzMAAOBRMABGKQbA98cAAIBH
xwAYpR7HAPDXp+vs+TT57X/wlGMAAMCjYwCMUiMGwGCXaitKVVrRcPdA7/M1qaysTI3eXvPXxhMH
vS11Ki2tVLOvT5W3d+rF19Yqp6Pb/PPO1mqVllXKbX2x/kBPq8pLy9XYcef7+vWosapUZTUtGvbS
AXe11JeptLRK7UM3J/V5VF1Wqkrjb824dk+X2lobVVXXIG9Plxqq69TWZb7AQEAxAADg0TEARqk7
A6CytlHq7lDU7ml64Znn9fwv39GSL26pqiZe+xb9k5559hn9YfF2Zbdkaev0aZo0fpye//0/6e25
X2r7/Nf1//zlT7XmYrm8lSe1dNLP9fxvf6N395xSbUerIlbN0Ktvv6hXXtqs5NIGFV2ZrTdf/oOe
fe41rUsoUN/dFdCrktANev/F3+r5P7ysj+YdVklVmSL3vKE//P55/er9j3WlrkAhWxbp9Xcn6KU3
n9eHizZp5rhx+mBNsFq6ze9lHDAMAAB4dAyAUerOAKhvalFDUb5mvD9fha2SGot1ec8R7Vo/T0t3
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</Preview>
<Form>7gF61QJ5XRkAACODCAAAAAAABADVmGlvqkwUgL836X8gfq2paMElURNwqxYXwKW9XxqWEag4Y1ncfv07A/bV
VqrjzfWmt01wgDmc5TnnzEC5r78BI/CrtzcMU45PmGCzAJWUuvEDML+fONBEK/++ibx5fEwzSbfS
zBh4voNghbtnyX+aqYVuEHqgAkEYeJqbZgah7jrGE9gM0QzAil4oaLzB57OlBw6wxVKKgdoca57i
52VTjGE7runheakagoGHXD8VmYkNHXhoAbxgsxMQwgCphuaCujMHkBiBp+bTTPahnPmYek60i0yQ
qjaxprMyNdcBMFCdLRbI5/g081DMnxXq4WOqGrl2dq4aaF4wQL4TYFdS1RrWBjzV8ACAZ2WHYB0Q
P7z58dTGEj9pN09Cmrmz55WMy5no7sfU86kgaTpwr54LLtEyBFCDwUiRTiXFN2wjSkMvBEfhOBaQ
kKHFIc9jqsUchUiM9bOVFGK75EnO0QSomt6GJlinqjmWZnqUA7E9TJJB5UzM96fRFhYLElBJd/8q
6YcCNem9hdSU+cLFlLMlasrYIIZY9AcYkweKaH11yh7wsaSPVV1GeQ8tW+LSDE8T0y7W5LgOpE+N
mPPeRmrOHJtLM7kSFbo96eI/BC6IOsqr/vvgSLWV6Kttr5CaQpbFDtJ1yT0EGovicjOws8hH9wZK
WF9/LDgt7lqXkxORZ+KtR7BxcWh7CF7eW6mqNKZ9YOVluC/trse7te9wdzevaogvv2Lb/gBvMQwC
BK+O2wfQ/N0KLUbxpIdGdFHTKuCEyF0Ii6eG1epTTB35YOz4oeZGSS1qxqyGXOR9vzwcbprxzt+Y
xT6/RuMvu+aLE6ILYKgGnrO4ek7gF6PQJ5qGNsDcLsqO9lyzAHlLcqAVg8zRNtk29ungyXgCuXKy
JyLkRiEhsSGTrxeaA7OwYQqYAhwQA3ysdiRQR9akmMyhNxlybe/9Jd0RW0wTwbjMPuOjEBtopolx
4e0nJoU14SNNmdpoRTwibg+dhU+9azp4G84db2lOFjhHXeD/ByHhFfqw9D6fUCzDfy/lTufWdx8p
XMeC2HkcAsWx7PNfKOr4tI5W8Ev1/dDaO6o8U/NmJwvva9n9I365BB69Y2cxR335AK/oQM3bVJ2x
2FdW7FPLQgL+66kjuzGy8Egkp4JcE17I77SYKdlkILZMcThqCILUGtQya1uUyVV3pTbd7e0NHvaX
+FD3VqKrrzcquSvarDK22VGuNDcfTduYjwSj1VzoUA71+Zht1+Wwq3LZXw3zJdL8NO4ojebo9qbf
uAtmM79vvQmyLM2fDU3rFEc8O5NYXd5aUuAoXIef1rx33W4XuZHebEMwWXPLJ4Xthqbh+hL30u7N
tKKjY9umUmuob+Rhd1RqyGKwfQ8HARItQZJ5Eci9gmX8avTad8+rZjY/4Y07YaIuVU7s9IJt+0WC
fV+cKsvHZ7mHlNub8WCOBL8dTiR1Cnm7+PacX2n97rOqhLzaayj6S34rraTtu/TkzcDW0nPAKRWX
raU6kVd26JjDocwNzMd37DGJm9hRRnzDm3Usy6pUypkdHkq4uzegxEZx/gti1I4fyAvpcXs9aq5x
s999NUpYX35+P03uGCcjmyhCGdgsm8WRPV5Qk5etOtZ0+mPsbl+ZaNLxRvPn4/im0Z3kkSxzFSBS
8iKaQCTZqJNIPoZ+9T9wSmBFXRkAAA==</Form>
<Code><![CDATA[Import-Module Az
$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={
$getRegJob= @()
$resultsBox.Text = (Register-PnPEntraIDAppForInteractiveLogin -ApplicationName "$appName_box" -Tenant $tenant_box -Interactive)
}
]]></Code>
<TV>0</TV>
<Mode>1</Mode>
<Assemblies />
</File>

Binary file not shown.

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
}

View File

@@ -0,0 +1,38 @@
$oldPrefix = "\\Srv75008s\juridique"
$newPrefix = "%userprofile%\Skornik\Dossiers utilisateurs - Documents\Juridique"
#$oldPrefix = "\\srv75008s\Commun"
#$newPrefix = "%userprofile%\Skornik\Commun - Documents"
$searchPath = "Z:\juridique"
$dryRun = $FALSE
$shell = new-object -com wscript.shell
if ( $dryRun ) {
write-host "Dry run..." -foregroundcolor green -backgroundcolor black
} else {
write-host "Warning : Real run" -foregroundcolor red -backgroundcolor black
}
dir $searchPath -filter *.lnk -recurse | foreach {
$lnk = $shell.createShortcut( $_.fullname )
$oldPath= $lnk.targetPath
$lnkRegex = "^" + [regex]::escape( $oldPrefix )
if ( $oldPath -match $lnkRegex ) {
$newPath = $oldPath -replace $lnkRegex, $newPrefix
write-host "Found: " + $_.fullname -foregroundcolor yellow -backgroundcolor black
write-host " Replace: " + $oldPath
write-host " With: " + $newPath
if ( !$dryRun ) {
$lnk.targetPath = $newPath
$lnk.Save()
}
}
}

View File

@@ -0,0 +1,11 @@
{
"configurations": [
{
"name": "PowerShell: Launch Script",
"type": "PowerShell",
"request": "launch",
"script": "${workspaceFolder}\\sputils.ps1",
"args": []
}
]
}

Binary file not shown.

Binary file not shown.

View File

@@ -1,14 +0,0 @@
20240307 08:51:28: ForEach-Object: C:\Users\SebastienQUEROL\git.azuze.fr\ps-scripts\Sharepoint\gui\spmover\Functions.ps1:43:31 Line | 43 | $Xml.Attributes | ForEach-Object { | ~~~~~~~~~~~~~~~~ | Exception setting "Image": "Cannot convert the "System.Drawing.Bitmap" value of type "System.String" to type "System.Drawing.Image"."
20240307 09:27:01: New-Object: C:\Users\SebastienQUEROL\git.azuze.fr\ps-scripts\Sharepoint\gui\spmover\Functions.ps1:33:71 Line | 33 | … ) {$newControl = New-Object System.Windows.Forms.$($Xml.ToString())} | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | Cannot find type [System.Windows.Forms.Image]: verify that the assembly containing this type is loaded.
20240307 09:28:50: New-Object: C:\Users\SebastienQUEROL\git.azuze.fr\ps-scripts\Sharepoint\gui\spmover\Functions.ps1:33:71 Line | 33 | … ) {$newControl = New-Object System.Windows.Forms.$($Xml.ToString())} | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | Cannot find type [System.Windows.Forms.Image]: verify that the assembly containing this type is loaded.
20240307 09:34:41: ForEach-Object: C:\Users\SebastienQUEROL\git.azuze.fr\ps-scripts\Sharepoint\gui\spmover\Functions.ps1:43:31 Line | 43 | $Xml.Attributes | ForEach-Object { | ~~~~~~~~~~~~~~~~ | Exception setting "Image": "Cannot convert the "System.Drawing.Bitmap" value of type "System.String" to type "System.Drawing.Image"."
20240307 09:34:53: ForEach-Object: C:\Users\SebastienQUEROL\git.azuze.fr\ps-scripts\Sharepoint\gui\spmover\Functions.ps1:43:31 Line | 43 | $Xml.Attributes | ForEach-Object { | ~~~~~~~~~~~~~~~~ | Exception setting "Image": "Cannot convert the "System.Drawing.Bitmap" value of type "System.String" to type "System.Drawing.Image"."
20240307 09:38:58: ForEach-Object: C:\Users\SebastienQUEROL\git.azuze.fr\ps-scripts\Sharepoint\gui\spmover\Functions.ps1:43:31 Line | 43 | $Xml.Attributes | ForEach-Object { | ~~~~~~~~~~~~~~~~ | Exception setting "Image": "Cannot convert the "System.Drawing.Bitmap" value of type "System.String" to type "System.Drawing.Image"."
20240307 09:40:53: ForEach-Object: C:\Users\SebastienQUEROL\git.azuze.fr\ps-scripts\Sharepoint\gui\spmover\Functions.ps1:43:31 Line | 43 | $Xml.Attributes | ForEach-Object { | ~~~~~~~~~~~~~~~~ | Exception setting "Image": "Cannot convert the "System.Drawing.Bitmap" value of type "System.String" to type "System.Drawing.Image"."
20240307 09:41:31: ForEach-Object: C:\Users\SebastienQUEROL\git.azuze.fr\ps-scripts\Sharepoint\gui\spmover\Functions.ps1:43:31 Line | 43 | $Xml.Attributes | ForEach-Object { | ~~~~~~~~~~~~~~~~ | Exception setting "Image": "Cannot convert the "System.Drawing.Image" value of type "System.String" to type "System.Drawing.Image"."
20240307 09:44:00: ForEach-Object: C:\Users\SebastienQUEROL\git.azuze.fr\ps-scripts\Sharepoint\gui\spmover\Functions.ps1:43:31 Line | 43 | $Xml.Attributes | ForEach-Object { | ~~~~~~~~~~~~~~~~ | Exception setting "Image": "Cannot convert the "System.Drawing.Bitmap" value of type "System.String" to type "System.Drawing.Image"."
20240307 09:44:41: ForEach-Object: C:\Users\SebastienQUEROL\git.azuze.fr\ps-scripts\Sharepoint\gui\spmover\Functions.ps1:43:31 Line | 43 | $Xml.Attributes | ForEach-Object { | ~~~~~~~~~~~~~~~~ | Exception setting "Image": "Cannot convert the "System.Drawing.Bitmap" value of type "System.String" to type "System.Drawing.Image"."
20240307 09:45:56: ForEach-Object: C:\Users\SebastienQUEROL\git.azuze.fr\ps-scripts\Sharepoint\gui\spmover\Functions.ps1:43:31 Line | 43 | $Xml.Attributes | ForEach-Object { | ~~~~~~~~~~~~~~~~ | Exception setting "Image": "Cannot convert the "System.Drawing.Bitmap" value of type "System.String" to type "System.Drawing.Image"."
20240307 09:47:04: ForEach-Object: C:\Users\SebastienQUEROL\git.azuze.fr\ps-scripts\Sharepoint\gui\spmover\Functions.ps1:43:31 Line | 43 | $Xml.Attributes | ForEach-Object { | ~~~~~~~~~~~~~~~~ | Exception setting "Image": "Cannot convert the "System.Drawing.Bitmap" value of type "System.String" to type "System.Drawing.Image"."
20240307 09:48:25: ForEach-Object: C:\Users\SebastienQUEROL\git.azuze.fr\ps-scripts\Sharepoint\gui\spmover\Functions.ps1:43:31 Line | 43 | $Xml.Attributes | ForEach-Object { | ~~~~~~~~~~~~~~~~ | Exception calling "Add" with "2" argument(s): "Item has already been added. Key in dictionary: 'lbl_byWho' Key being added: 'lbl_byWho'"
20240307 11:16:28: InvalidOperation: Line | 45 | $Script:refs['btn_Start'].Add_Click($eventSB['btn_Start'].Cli … | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | Cannot index into a null array.

View File

@@ -0,0 +1,3 @@
# SharePoint Utils
Sharepoint Utils concatenate all the useful scripts useed to manage your SharePoints in one easy to use GUI.

View File

@@ -1,186 +0,0 @@
################################################################################
#
# Name : SharePoint Mover
# Version : 0.1
# Author :
# Date : 07/03/2024
#
# Generated with ConvertForm module version 2.0.0
# PowerShell version 7.4.1
#
# Invocation Line : Convert-Form -Path $Source -Destination $Destination -Encoding ascii -force
# Source : C:\Users\SebastienQUEROL\source\repos\sharepointmover-gui\Form1.Designer.cs
################################################################################
function Get-ScriptDirectory
{ #Return the directory name of this script
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
Split-Path $Invocation.MyCommand.Path
}
$ScriptPath = Get-ScriptDirectory
# Chargement des assemblies externes
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$FMain = New-Object System.Windows.Forms.Form
$components = New-Object System.ComponentModel.Container
$menuStrip1 = New-Object System.Windows.Forms.MenuStrip
$Mconnexion = New-Object System.Windows.Forms.ToolStripMenuItem
$MConnexionSharepoint = New-Object System.Windows.Forms.ToolStripMenuItem
$Mquestion = New-Object System.Windows.Forms.ToolStripMenuItem
$MQuestionApropos = New-Object System.Windows.Forms.ToolStripMenuItem
$MQuestionWiki = New-Object System.Windows.Forms.ToolStripMenuItem
$Bgo = New-Object System.Windows.Forms.Button
$CBsourceSite = New-Object System.Windows.Forms.ComboBox
$CBdestSite = New-Object System.Windows.Forms.ComboBox
$progressBar1 = New-Object System.Windows.Forms.ProgressBar
$sourceInfo = New-Object System.Windows.Forms.ToolTip($components)
$label1 = New-Object System.Windows.Forms.Label
$label2 = New-Object System.Windows.Forms.Label
#
# menuStrip1
#
$menuStrip1.Items.AddRange(@(
$Mconnexion,
$Mquestion))
$menuStrip1.Location = New-Object System.Drawing.Point(0, 0)
$menuStrip1.Name = "menuStrip1"
$menuStrip1.Size = New-Object System.Drawing.Size(800, 24)
$menuStrip1.TabIndex = 0
$menuStrip1.Text = "menuStrip1"
#
# Mconnexion
#
$Mconnexion.DropDownItems.AddRange(@(
$MConnexionSharepoint))
$Mconnexion.Name = "Mconnexion"
$Mconnexion.Size = New-Object System.Drawing.Size(77, 20)
$Mconnexion.Text = "Connexion"
#
# MConnexionSharepoint
#
$MConnexionSharepoint.CheckOnClick = $true
$MConnexionSharepoint.Name = "MConnexionSharepoint"
$MConnexionSharepoint.Size = New-Object System.Drawing.Size(131, 22)
$MConnexionSharepoint.Text = "Sharepoint"
#
# Mquestion
#
$Mquestion.DropDownItems.AddRange(@(
$MQuestionApropos,
$MQuestionWiki))
$Mquestion.Name = "Mquestion"
$Mquestion.Size = New-Object System.Drawing.Size(24, 20)
$Mquestion.Text = "?"
#
# MQuestionApropos
#
$MQuestionApropos.Name = "MQuestionApropos"
$MQuestionApropos.Size = New-Object System.Drawing.Size(131, 22)
$MQuestionApropos.Text = "A propos..."
#
# MQuestionWiki
#
$MQuestionWiki.Name = "MQuestionWiki"
$MQuestionWiki.Size = New-Object System.Drawing.Size(131, 22)
$MQuestionWiki.Text = "Wiki"
#
# Bgo
#
$Bgo.ForeColor = [System.Drawing.Color]::White
$Bgo.Location = New-Object System.Drawing.Point(688, 155)
$Bgo.Name = "Bgo"
$Bgo.Size = New-Object System.Drawing.Size(75, 23)
$Bgo.TabIndex = 1
$Bgo.Text = "GO"
$Bgo.UseVisualStyleBackColor = $true
#
# CBsourceSite
#
$CBsourceSite.ForeColor = [System.Drawing.Color]::White
$CBsourceSite.FormattingEnabled = $true
$CBsourceSite.Location = New-Object System.Drawing.Point(27, 131)
$CBsourceSite.Name = "CBsourceSite"
$CBsourceSite.Size = New-Object System.Drawing.Size(587, 21)
$CBsourceSite.TabIndex = 2
#
# CBdestSite
#
$CBdestSite.ForeColor = [System.Drawing.Color]::White
$CBdestSite.FormattingEnabled = $true
$CBdestSite.Location = New-Object System.Drawing.Point(27, 182)
$CBdestSite.Name = "CBdestSite"
$CBdestSite.Size = New-Object System.Drawing.Size(587, 21)
$CBdestSite.TabIndex = 3
#
# progressBar1
#
$progressBar1.Location = New-Object System.Drawing.Point(12, 345)
$progressBar1.Name = "progressBar1"
$progressBar1.Size = New-Object System.Drawing.Size(776, 23)
$progressBar1.TabIndex = 4
#
# label1
#
$label1.AutoSize = $true
$label1.Location = New-Object System.Drawing.Point(27, 112)
$label1.Name = "label1"
$label1.Size = New-Object System.Drawing.Size(62, 13)
$label1.TabIndex = 5
$label1.Text = "Site Source"
#
# label2
#
$label2.AutoSize = $true
$label2.Location = New-Object System.Drawing.Point(27, 166)
$label2.Name = "label2"
$label2.Size = New-Object System.Drawing.Size(81, 13)
$label2.TabIndex = 6
$label2.Text = "Site Destination"
#
# FMain
#
$FMain.BackColor = [System.Drawing.SystemColors]::ControlText
$FMain.ClientSize = New-Object System.Drawing.Size(800, 450)
$FMain.Controls.Add($label2)
$FMain.Controls.Add($label1)
$FMain.Controls.Add($progressBar1)
$FMain.Controls.Add($CBdestSite)
$FMain.Controls.Add($CBsourceSite)
$FMain.Controls.Add($Bgo)
$FMain.Controls.Add($menuStrip1)
$FMain.ForeColor = [System.Drawing.Color]::Snow
$FMain.MainMenuStrip = $menuStrip1
$FMain.Name = "FMain"
$FMain.Text = "SharePoint Mover GUI"
$CBsourceSite.SelectedIndex = 0
$CBtargetSite.SelectedIndex = 0
$MConnexionSharepoint.add_click({
Connect-PnPOnline -Url $tenantURL -Interactive
###############On recupere puis stocke la liste des sites dans les box
$ComboboxList = (Get-SPOSite | Select Url).name
$CBsourceSite.Items.AddRange($ComboboxList)
$ComboboxList = (Get-SPOSite | Select Url).name
$CBtargetSite.Items.AddRange($ComboboxList)
###############
})
$Bgo.add_click({
Move-PnPFile -SiteRelativeUrl $srcSite -TargetUrl $destSite -Force -AllowSchemaMismatch
})
$FMain.ShowDialog()

View File

@@ -0,0 +1,544 @@
################################################################################
#
# Name : C:\Users\SebastienQUEROL\source\repos\sharepointmover-gui\Form1.ps1
# Version : 0.1
# Author :
# Date : 08/03/2024
#
# Generated with ConvertForm module version 2.0.0
# PowerShell version 7.4.1
#
# Invocation Line : Convert-Form -Path $Source -Destination $Destination -Encoding utf8 -force
# Source : C:\Users\SebastienQUEROL\source\repos\sharepointmover-gui\Form1.Designer.cs
################################################################################
###############Thread Setup
$Global:syncHash = [hashtable]::Synchronized(@{})
$newRunspace =[runspacefactory]::CreateRunspace()
$newRunspace.ApartmentState ="STA"
$newRunspace.ThreadOptions ="ReuseThread"
$newRunspace.Open()
$newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
###########################
##Aucune foutre idée de ce qu'est cense faire ce morceau de code, ca a été généré par le createur de forms
# function Get-ScriptDirectory
# { #Return the directory name of this script
# $Invocation = (Get-Variable MyInvocation -Scope 1).Value
# Split-Path $Invocation.MyCommand.Path
# }
# $ScriptPath = Get-ScriptDirectory
###
# Chargement des assemblies externes
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$FMain = New-Object System.Windows.Forms.Form
$components = New-Object System.ComponentModel.Container
$menuStrip1 = New-Object System.Windows.Forms.MenuStrip
$Mquestion = New-Object System.Windows.Forms.ToolStripMenuItem
$MQuestionApropos = New-Object System.Windows.Forms.ToolStripMenuItem
$MQuestionWiki = New-Object System.Windows.Forms.ToolStripMenuItem
$Bgo = New-Object System.Windows.Forms.Button
$BlistSites = New-Object System.Windows.Forms.Button
$CBsourceSite = New-Object System.Windows.Forms.ComboBox
$CBdestSite = New-Object System.Windows.Forms.ComboBox
$progressBar1 = New-Object System.Windows.Forms.ProgressBar
$sourceInfo = New-Object System.Windows.Forms.ToolTip($components)
$label1 = New-Object System.Windows.Forms.Label
$label2 = New-Object System.Windows.Forms.Label
$tabs = New-Object System.Windows.Forms.TabControl
$tabPage1 = New-Object System.Windows.Forms.TabPage
$tabPage2 = New-Object System.Windows.Forms.TabPage
$BconnectSP = New-Object System.Windows.Forms.Button
$URLTenant = New-Object System.Windows.Forms.TextBox
$label3 = New-Object System.Windows.Forms.Label
$groupBox1 = New-Object System.Windows.Forms.GroupBox
$groupBox2 = New-Object System.Windows.Forms.GroupBox
$radioButton1 = New-Object System.Windows.Forms.RadioButton
$radioButton2 = New-Object System.Windows.Forms.RadioButton
$radioButton3 = New-Object System.Windows.Forms.RadioButton
$button1 = New-Object System.Windows.Forms.Button
$checkBox1 = New-Object System.Windows.Forms.CheckBox
$label4 = New-Object System.Windows.Forms.Label
$tabPage3 = New-Object System.Windows.Forms.TabPage
$tabPage4 = New-Object System.Windows.Forms.TabPage
$tabPage5 = New-Object System.Windows.Forms.TabPage
$LresultsMove = New-Object System.Windows.Forms.ListView
#
# menuStrip1
#
$menuStrip1.Items.AddRange(@(
$Mquestion))
$menuStrip1.Location = New-Object System.Drawing.Point(0, 0)
$menuStrip1.Name = "menuStrip1"
$menuStrip1.Size = New-Object System.Drawing.Size(800, 24)
$menuStrip1.TabIndex = 0
$menuStrip1.Text = "menuStrip1"
#
# Mquestion
#
$Mquestion.DropDownItems.AddRange(@(
$MQuestionApropos,
$MQuestionWiki))
$Mquestion.Name = "Mquestion"
$Mquestion.Size = New-Object System.Drawing.Size(24, 20)
$Mquestion.Text = "?"
#
# MQuestionApropos
#
$MQuestionApropos.Name = "MQuestionApropos"
$MQuestionApropos.Size = New-Object System.Drawing.Size(180, 22)
$MQuestionApropos.Text = "A propos..."
#
# MQuestionWiki
#
$MQuestionWiki.Name = "MQuestionWiki"
$MQuestionWiki.Size = New-Object System.Drawing.Size(180, 22)
$MQuestionWiki.Text = "Wiki"
#
# Bgo
#
$Bgo.ForeColor = [System.Drawing.Color]::Black
$Bgo.Location = New-Object System.Drawing.Point(649, 83)
$Bgo.Name = "Bgo"
$Bgo.Size = New-Object System.Drawing.Size(75, 23)
$Bgo.TabIndex = 1
$Bgo.Text = "GO"
$Bgo.UseVisualStyleBackColor = $true
#
# BlistSites
#
$BlistSItes.ForeColor = [System.Drawing.Color]::Black
$BlistSItes.Location = New-Object System.Drawing.Point(649, 55)
$BlistSItes.Name = "BlistSites"
$BlistSItes.Size = New-Object System.Drawing.Size(75, 23)
$BlistSItes.TabIndex = 2
$BlistSItes.Text = "List. Sites"
$BlistSItes.UseVisualStyleBackColor = $true
#
# CBsourceSite
#
$CBsourceSite.FormattingEnabled = $true
$CBsourceSite.Location = New-Object System.Drawing.Point(23, 44)
$CBsourceSite.Name = "CBsourceSite"
$CBsourceSite.Size = New-Object System.Drawing.Size(587, 21)
$CBsourceSite.TabIndex = 3
#
# CBdestSite
#
$CBdestSite.FormattingEnabled = $true
$CBdestSite.Location = New-Object System.Drawing.Point(23, 113)
$CBdestSite.Name = "CBdestSite"
$CBdestSite.Size = New-Object System.Drawing.Size(587, 21)
$CBdestSite.TabIndex = 4
#
# progressBar1
#
$progressBar1.Location = New-Object System.Drawing.Point(8, 369)
$progressBar1.Name = "progressBar1"
$progressBar1.Size = New-Object System.Drawing.Size(776, 23)
$progressBar1.TabIndex = 5
#
# label1
#
$label1.AutoSize = $true
$label1.ForeColor = [System.Drawing.Color]::Black
$label1.Location = New-Object System.Drawing.Point(23, 19)
$label1.Name = "label1"
$label1.Size = New-Object System.Drawing.Size(41, 13)
$label1.TabIndex = 6
$label1.Text = "Source"
#
# label2
#
$label2.AutoSize = $true
$label2.ForeColor = [System.Drawing.Color]::Black
$label2.Location = New-Object System.Drawing.Point(23, 88)
$label2.Name = "label2"
$label2.Size = New-Object System.Drawing.Size(60, 13)
$label2.TabIndex = 7
$label2.Text = "Destination"
#
# tabs
#
$tabs.Controls.Add($tabPage1)
$tabs.Controls.Add($tabPage3)
$tabs.Controls.Add($tabPage4)
$tabs.Controls.Add($tabPage5)
$tabs.Controls.Add($tabPage2)
$tabs.Location = New-Object System.Drawing.Point(0, 27)
$tabs.Name = "tabs"
$tabs.SelectedIndex = 0
$tabs.Size = New-Object System.Drawing.Size(800, 424)
$tabs.TabIndex = 8
#
# tabPage1
#
$tabPage1.Controls.Add($LresultsMove)
$tabPage1.Controls.Add($label1)
$tabPage1.Controls.Add($progressBar1)
$tabPage1.Controls.Add($label2)
$tabPage1.Controls.Add($Bgo)
$tabPage1.Controls.Add($BlistSites)
$tabPage1.Controls.Add($CBsourceSite)
$tabPage1.Controls.Add($CBdestSite)
$tabPage1.Location = New-Object System.Drawing.Point(4, 22)
$tabPage1.Name = "tabPage1"
$tabPage1.Padding = New-Object System.Windows.Forms.Padding(3)
$tabPage1.Size = New-Object System.Drawing.Size(792, 398)
$tabPage1.TabIndex = 0
$tabPage1.Text = "Move"
$tabPage1.UseVisualStyleBackColor = $true
#
# tabPage2
#
$tabPage2.Controls.Add($groupBox2)
$tabPage2.Controls.Add($groupBox1)
$tabPage2.Location = New-Object System.Drawing.Point(4, 22)
$tabPage2.Name = "tabPage2"
$tabPage2.Padding = New-Object System.Windows.Forms.Padding(3)
$tabPage2.Size = New-Object System.Drawing.Size(792, 398)
$tabPage2.TabIndex = 1
$tabPage2.Text = "Parametres"
$tabPage2.UseVisualStyleBackColor = $true
#
# BconnectSP
#
$BconnectSP.ForeColor = [System.Drawing.Color]::Black
$BconnectSP.Location = New-Object System.Drawing.Point(376, 53)
$BconnectSP.Name = "BconnectSP"
$BconnectSP.Size = New-Object System.Drawing.Size(75, 23)
$BconnectSP.TabIndex = 0
$BconnectSP.Text = "Connexion"
$BconnectSP.UseVisualStyleBackColor = $true
#
# URLTenant
#
$URLTenant.Location = New-Object System.Drawing.Point(22, 55)
$URLTenant.Name = "URLTenant"
$URLTenant.Text = "https://guycarlier.sharepoint.com"
$URLTenant.Size = New-Object System.Drawing.Size(325, 20)
$URLTenant.TabIndex = 1
#
# label3
#
$label3.AutoSize = $true
$label3.ForeColor = [System.Drawing.Color]::Black
$label3.Location = New-Object System.Drawing.Point(22, 32)
$label3.Name = "label3"
$label3.Size = New-Object System.Drawing.Size(132, 13)
$label3.TabIndex = 2
$label3.Text = "URL du tenant SharePoint"
#
# groupBox1
#
$groupBox1.Controls.Add($label4)
$groupBox1.Controls.Add($label3)
$groupBox1.Controls.Add($BconnectSP)
$groupBox1.Controls.Add($URLTenant)
$groupBox1.Location = New-Object System.Drawing.Point(8, 6)
$groupBox1.Name = "groupBox1"
$groupBox1.Size = New-Object System.Drawing.Size(473, 100)
$groupBox1.TabIndex = 3
$groupBox1.TabStop = $false
$groupBox1.Text = "Connexion"
#
# groupBox2
#
$groupBox2.Controls.Add($checkBox1)
$groupBox2.Controls.Add($button1)
$groupBox2.Controls.Add($radioButton3)
$groupBox2.Controls.Add($radioButton2)
$groupBox2.Controls.Add($radioButton1)
$groupBox2.Location = New-Object System.Drawing.Point(9, 113)
$groupBox2.Name = "groupBox2"
$groupBox2.Size = New-Object System.Drawing.Size(472, 145)
$groupBox2.TabIndex = 4
$groupBox2.TabStop = $false
$groupBox2.Text = "Rapports"
#
# radioButton1
#
$radioButton1.AutoSize = $true
$radioButton1.ForeColor = [System.Drawing.Color]::Black
$radioButton1.Location = New-Object System.Drawing.Point(23, 66)
$radioButton1.Name = "radioButton1"
$radioButton1.Size = New-Object System.Drawing.Size(141, 17)
$radioButton1.TabIndex = 0
$radioButton1.TabStop = $true
$radioButton1.Text = "Intégralité des messages"
$radioButton1.UseVisualStyleBackColor = $true
#
# radioButton2
#
$radioButton2.AutoSize = $true
$radioButton2.ForeColor = [System.Drawing.Color]::Black
$radioButton2.Location = New-Object System.Drawing.Point(23, 92)
$radioButton2.Name = "radioButton2"
$radioButton2.Size = New-Object System.Drawing.Size(109, 17)
$radioButton2.TabIndex = 1
$radioButton2.TabStop = $true
$radioButton2.Text = "Erreurs seulement"
$radioButton2.UseVisualStyleBackColor = $true
#
# radioButton3
#
$radioButton3.AutoSize = $true
$radioButton3.ForeColor = [System.Drawing.Color]::Black
$radioButton3.Location = New-Object System.Drawing.Point(23, 116)
$radioButton3.Name = "radioButton3"
$radioButton3.Size = New-Object System.Drawing.Size(113, 17)
$radioButton3.TabIndex = 2
$radioButton3.TabStop = $true
$radioButton3.Text = "Réussis seulement"
$radioButton3.UseVisualStyleBackColor = $true
#
# button1
#
$button1.ForeColor = [System.Drawing.Color]::Black
$button1.Location = New-Object System.Drawing.Point(21, 29)
$button1.Name = "button1"
$button1.Size = New-Object System.Drawing.Size(174, 23)
$button1.TabIndex = 3
$button1.Text = "Choix de l'emplacement..."
$button1.UseVisualStyleBackColor = $true
#
# checkBox1
#
$checkBox1.AutoSize = $true
$checkBox1.ForeColor = [System.Drawing.Color]::Black
$checkBox1.Location = New-Object System.Drawing.Point(189, 68)
$checkBox1.Name = "checkBox1"
$checkBox1.Size = New-Object System.Drawing.Size(153, 17)
$checkBox1.TabIndex = 4
$checkBox1.Text = "Inclure ligne de commande"
$checkBox1.UseVisualStyleBackColor = $true
#
# label4
#
$label4.AutoSize = $true
$label4.ForeColor = [System.Drawing.Color]::MediumVioletRed
$label4.Location = New-Object System.Drawing.Point(380, 32)
$label4.Name = "label4"
$label4.Size = New-Object System.Drawing.Size(66, 13)
$label4.TabIndex = 3
$label4.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter
##On modifie le texte du label en fonction de l'état initial de la connection a PNPOnline
$pnpConnection = Get-PnPConnection | Out-string
if(-not ([string]::IsNullOrEmpty($pnpConnection))){
$pnpConnection -match "Url : (?<content>.*)/"
$pnpConnectionUrl = $matches["content"]
$label4.Text = "Connecté"
$label4.ForeColor = [System.Drawing.Color]::Green
$URLTenant.Text = $pnpConnectionUrl
}else{
$label4.Text = "Déconnecté"
$label4.ForeColor = [System.Drawing.Color]::MediumVioletRed
}
#
# tabPage3
#
$tabPage3.Location = New-Object System.Drawing.Point(4, 22)
$tabPage3.Name = "tabPage3"
$tabPage3.Padding = New-Object System.Windows.Forms.Padding(3)
$tabPage3.Size = New-Object System.Drawing.Size(792, 398)
$tabPage3.TabIndex = 2
$tabPage3.Text = "Rapports"
$tabPage3.UseVisualStyleBackColor = $true
#
# tabPage4
#
$tabPage4.Location = New-Object System.Drawing.Point(4, 22)
$tabPage4.Name = "tabPage4"
$tabPage4.Padding = New-Object System.Windows.Forms.Padding(3)
$tabPage4.Size = New-Object System.Drawing.Size(792, 398)
$tabPage4.TabIndex = 3
$tabPage4.Text = "Import"
$tabPage4.UseVisualStyleBackColor = $true
#
# tabPage5
#
$tabPage5.Location = New-Object System.Drawing.Point(4, 22)
$tabPage5.Name = "tabPage5"
$tabPage5.Padding = New-Object System.Windows.Forms.Padding(3)
$tabPage5.Size = New-Object System.Drawing.Size(792, 398)
$tabPage5.TabIndex = 4
$tabPage5.Text = "Audit"
$tabPage5.UseVisualStyleBackColor = $true
#
# LresultsMove
#
$LresultsMove.HideSelection = $false
$LresultsMove.Location = New-Object System.Drawing.Point(8, 173)
$LresultsMove.Name = "LresultsMove"
#$LresultsMove.FullRowSelect = true
$LresultsMove.Size = New-Object System.Drawing.Size(776, 190)
$LresultsMove.TabIndex = 7
$LresultsMove.AutoSize = $true
#$LresultsMove.MultiColumn = $false
#$LresultsMove.UseCompatibleStateImageBehavior = $false
#
# FMain
#
$FMain.BackColor = [System.Drawing.SystemColors]::ControlText
$FMain.ClientSize = New-Object System.Drawing.Size(800, 450)
$FMain.Controls.Add($tabs)
$FMain.Controls.Add($menuStrip1)
$FMain.ForeColor = [System.Drawing.Color]::Black
$FMain.MainMenuStrip = $menuStrip1
$FMain.Name = "FMain"
$FMain.Text = "SharePoint Utils GUI"
#Onglet Move
##Lister les sites dans les comboBoxes
#### On lance le ScriptBlock dans un runspace au clic du bouton BlistSites
$BlistSites.Add_Click({
$newRunspace =[runspacefactory]::CreateRunspace()
$newRunspace.ApartmentState ="STA"
$newRunspace.ThreadOptions ="ReuseThread"
$newRunspace.Open()
$newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
$BlistSitesRunSpace = [PowerShell]::Create().AddScript({
#On vide la variable pnpConnection pour ne pas avoir de faux positifs
$pnpConnection=$Null
#On stocke la derniere connection PnP
$pnpConnection = Get-PnPConnection | Out-string
#A ameliorer, mais pour l'instant, ca devrait passer
if(-not ([string]::IsNullOrEmpty($pnpConnection))){
$CBdestSite.Items.Clear()
$CBsourceSite.Items.Clear()
$sitesList = $null
$sitesList = Get-PnPTenantSite | Where-Object -Property Template -NotIn ("SRCHCEN#0", "REDIRECTSITE#0", "SPSMSITEHOST#0", "APPCATALOG#0", "POINTPUBLISHINGHUB#0", "EDISC#0", "STS#-1", 'EHS#1','POINTPUBLISHINGTOPIC#0') | Select-Object url
$LresultsMove.Items.Clear()
foreach($siteUrl in $sitesList){
$siteUrl -match "@{Url=(?<content>.*)}"
$siteUrlClean = $matches["content"]
$CBsourceSite.Items.Add([string]$siteUrlClean)
$CBdestSite.Items.Add([string]$siteUrlClean)
}
}
elseif(([string]::IsNullOrEmpty($pnpConnection))){
$LresultsMove.Items.Clear()
$LresultsMove.Items.Add("Connectez-vous au tenant d'abord")
}
else{
$LresultsMove.Items.Clear()
$LresultsMove.Items.Add("Connectez-vous au tenant d'abord")
}
})
$BlistSitesRunSpace.PowerShell.Runspace = $newRunspace
$BlistSitesRunSpace.Thread = $BlistSitesRunSpace.PowerShell.BeginInvoke()
})
##Bouger les dossiers
# $copyIt = {
# param ($sourceSite,$destSite)
# $sourceSite = $sourceSite -Replace '[A-Za-z]+://([A-Za-z]+(\.[A-Za-z]+)+)',''
# $destSite = $destSite -Replace '[A-Za-z]+://([A-Za-z]+(\.[A-Za-z]+)+)',''
# $jobCopyPending = Copy-PnPFile -SourceUrl "$sourceSite" -TargetUrl "$destSite" -Force -OverwriteIfAlreadyExists
# $jobStatus = Receive-PnPCopyMoveJobStatus -Job $jobCopyPending -Wait
# Write-Output $jobStatus
# }
$Bgo.Add_Click({
$newRunspace =[runspacefactory]::CreateRunspace()
$newRunspace.ApartmentState ="STA"
$newRunspace.ThreadOptions ="ReuseThread"
$newRunspace.Open()
$newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
$copySPRunspace.PowerShell = [PowerShell]::Create().AddScript({
$destSite = $CBdestSite.Text
$sourceSite = $CBsourceSite.Text
$sourceSite = $sourceSite -Replace '[A-Za-z]+://([A-Za-z]+(\.[A-Za-z]+)+)',''
$destSite = $destSite -Replace '[A-Za-z]+://([A-Za-z]+(\.[A-Za-z]+)+)',''
$jobCopyPending = Copy-PnPFile -SourceUrl "$sourceSite" -TargetUrl "$destSite" -Force -OverwriteIfAlreadyExists
$jobStatus = Receive-PnPCopyMoveJobStatus -Job $jobCopyPending -Wait
Write-Output $jobStatus
})
$copySPRunspace.PowerShell.Runspace = $newRunspace
$copySPRunspace.Thread = $copySPRunspace.PowerShell.BeginInvoke()
})
#Onglet Parametres
##Connexion Sharepoint
$pnpConnection=$null
$pnpConnection = Get-PnPConnection | Out-string
$tenantURL = $URLTenant.Text
$BconnectSP.Add_Click({
Disconnect-PnPOnline
$newRunspace =[runspacefactory]::CreateRunspace()
$newRunspace.ApartmentState ="STA"
$newRunspace.ThreadOptions ="ReuseThread"
$newRunspace.Open()
$newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
$connectToSPRunspace.PowerShell = [PowerShell]::Create().AddScript({
Connect-PnPOnline -Url $tenantURL -Interactive | Out-String
Switch ($ERROR)
{
{$ERROR[0] -match "Host not reachable" }{
$label4.Text = "Injoignable"
$label4.ForeColor = [System.Drawing.Color]::MediumVioletRed
Break}
{$ERROR[0] -match "User canceled authentication."}{
$label4.Text = "Annulé"
$label4.ForeColor = [System.Drawing.Color]::MediumVioletRed
Break}
{-not ([string]::IsNullOrEmpty($pnpConnection))}{
$label4.Text = "Connecté"
$label4.ForeColor = [System.Drawing.Color]::Green
}
Default {
$label4.Text = "Connecté"
$label4.ForeColor = [System.Drawing.Color]::Green
}
}
})
$connectToSPRunspace.PowerShell.Runspace = $newRunspace
$connectToSPRunspace.Thread = $connectToSPRunspace.PowerShell.BeginInvoke()
})
function OnFormClosing_FMain{
# $this parameter is equal to the sender (object)
# $_ is equal to the parameter e (eventarg)
# The CloseReason property indicates a reason for the closure :
# if (($_).CloseReason -eq [System.Windows.Forms.CloseReason]::UserClosing)
#Sets the value indicating that the event should be canceled.
($_).Cancel= $False
}
$FMain.Add_FormClosing({
#Disconnect-PnPOnline
Write-Host "Goodbye, come again soon :*"
$RunspacePool.Close()
$RunspacePool.Dispose()
[gc]::Collect()
OnFormClosing_FMain
})
$FMain.Add_Shown({$FMain.Activate()})
$ModalResult=$FMain.ShowDialog()
# Libération de la Form
$FMain.Dispose()