Compare commits
45 Commits
54ee71c7f2
...
main
Author | SHA1 | Date | |
---|---|---|---|
0ca671b477 | |||
b6254903ca | |||
1d78d5367e | |||
d650d775ef | |||
ebf00f110f | |||
0b350b268d | |||
2e037fe448 | |||
ee7d0499e2 | |||
be0e6f7c4e | |||
b8bd6bd142 | |||
1018c693fd | |||
3a68df44b9 | |||
93c5060848 | |||
07bf2c14ce | |||
f308f5e804 | |||
826c49d164 | |||
7df974133a | |||
e7d688f972 | |||
842a474a80 | |||
7285578906 | |||
67f3e3a4fa | |||
5de0e4613d | |||
1ea4f9e09c | |||
74d891415f | |||
15a7637596 | |||
ec5cb7dc4a | |||
9409e59f57 | |||
|
8ee990cca2 | ||
|
d6982c4927 | ||
|
bc97219e5e | ||
|
eadda6107c | ||
|
2dd5bd9217 | ||
|
09d5e0f281 | ||
|
9c7533edb0 | ||
66bd96e180 | |||
5614dcb11c | |||
|
7824d55859 | ||
|
5f11213de5 | ||
|
a42c3bf5ef | ||
|
a66fb59b6e | ||
|
f3634db543 | ||
f401ceb825 | |||
|
f120caa0e2 | ||
993825bea5 | |||
8b50ddb79c |
124
AD/CreateN1-N2Users/Create-ADtechs.ps1
Normal file
124
AD/CreateN1-N2Users/Create-ADtechs.ps1
Normal 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
|
BIN
AD/CreateN1-N2Users/Create-ADtechs.ps1.psbuild
Normal file
BIN
AD/CreateN1-N2Users/Create-ADtechs.ps1.psbuild
Normal file
Binary file not shown.
BIN
AD/CreateN1-N2Users/bin/x64/Create-ADtechs.exe
Normal file
BIN
AD/CreateN1-N2Users/bin/x64/Create-ADtechs.exe
Normal file
Binary file not shown.
13
AD/CreateN1-N2Users/bin/x64/Create-ADtechs.exe.config
Normal file
13
AD/CreateN1-N2Users/bin/x64/Create-ADtechs.exe.config
Normal 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
17
Intune/Random-PWGen.ps1
Normal 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...
|
7
Misc/Multi-Thread/template.ps1
Normal file
7
Misc/Multi-Thread/template.ps1
Normal 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
|
||||||
|
|
||||||
|
|
646
Misc/Register Az App/regApp.psf
Normal file
646
Misc/Register Az App/regApp.psf
Normal 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
|
||||||
|
nFB3f5eObg3Sot1faul707QtslYazNe2j4O047Otmrv8orrVooMLxmnblUyps0Cfzp+vLy5f0epn
|
||||||
|
X9LCk1/p+I4LCrt8QvOnTVVsq9SXvV/PT9uhcs/QAuhriden77ynK1nGZ/oduvX5MR36cr1mzV6m
|
||||||
|
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
|
||||||
|
hAFAZMUAAOAkDAAiKwYAACdhABBZMQAAOAkDgMiKAQDASRgARFYMAABOwgAgsmIAAHASBgCRFQMA
|
||||||
|
gJMwAIisGAAAnIQBQGTFAADgJAwAIisGAAAnYQAQWTEAADgJA4DIigEAwEkYAERWDAAATsIAILJi
|
||||||
|
AABwEgYAkRUDAICTMACIrBgAAJyEAUBkxQAA4CQMACIrBgAAJ2EAEFkxAAA4CQOAyIoBAMBJGABE
|
||||||
|
VgwAAE7CACCyYgAAcBIGAJEVAwCAkzAAiKwYAACchAFAZMUAAOAkDAAiKwYAACdhABBZMQAAOAkD
|
||||||
|
gMiKAQDASRgARFYMAABOwgAgsmIAAHASBgCRFQMAgJMwAIisGAAAnIQBQGTFAADgJAwAIisGAAAn
|
||||||
|
YQAQWTEAADgJA4DIigEAwEkYAERWDAAATsIAILJiAABwEgYAkRUDAICTMACIrBgAAJyEAUBkxQAA
|
||||||
|
4CQMACIrBgAAJ2EAEFkxAAA4CQOAyIoBAMBJGABEVgwAAE7CACCyYgAAcBIGAJEVAwCAkzAAiKwY
|
||||||
|
AACchAFAZMUAAOAkDAAiKwYAACdhABBZMQAAOAkDgMiKAQDASRgARFYMAABOwgAgsmIAAHASBgCR
|
||||||
|
FQMAgJMwAIisGAAAnIQBQGTFAADgJAwAIisGAAAnYQAQWTEAADgJA4DIigEAwEkYAERWDAAATsIA
|
||||||
|
ILJiAABwEgYAkRUDAICTMACIrBgAAJyEAUBkxQAA4CQMACIrBgAAJ2EAEFndGQDxCQwAAE8/BgCR
|
||||||
|
lfE/gvr6el29Fqn4hBQlJKYSET2VxSWk6GrYDTU2NjEAiIza29tVW1evysoqIqKntorKKvOz//b7
|
||||||
|
/P/go8YAoDGb1+shInr6e8yf+d+JAUBEROTAGABEREQOjAFARETkwBgAREREDowBQERE5MAYAERE
|
||||||
|
RA6MAUBEROTAGABEREQOjAFARETkwBgAREREDowBQERE5MAYAERERA6MAUBEROTAGABEREQOjAFA
|
||||||
|
RETkwBgAREREDowBQERE5MAYAERERA6MAUBEROTAGABEREQOjAFARETkwBgAREREDowBQERE5MCe
|
||||||
|
2ACob3bL6xm6ASIiIvph5fF0qKX9CQyA6ia3WtuG1gURERH9sGpp61B9y2MeAMPfEBEREf1ws5/b
|
||||||
|
j2UAEBER0diJAUBEROTAvtcAKKjzjbhbgYiIiMZOeTUeNT3wAJg8pczbLbV0Ss3eQSIiIhqjNXkH
|
||||||
|
1S9pzdr1sp/3I7z62mtFq1atHTDWwooVq4iIiGgMt2bNuoF3332vz37eAwAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+l/x8mY9ttTpQ3HwAAAABJRU5ErkJggg==</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>
|
BIN
Misc/Register Az App/regApp.psf.psbuild
Normal file
BIN
Misc/Register Az App/regApp.psf.psbuild
Normal file
Binary file not shown.
322
Sharepoint/Sharepoint_Export_v3.ps1
Normal file
322
Sharepoint/Sharepoint_Export_v3.ps1
Normal 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
|
328
Sharepoint/Sharepoint_Export_v3_mass.ps1
Normal file
328
Sharepoint/Sharepoint_Export_v3_mass.ps1
Normal 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
|
||||||
|
}
|
38
Sharepoint/gui/Re-Link/reLink.ps1
Normal file
38
Sharepoint/gui/Re-Link/reLink.ps1
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
Sharepoint/gui/spmover/.vscode/launch.json
vendored
Normal file
11
Sharepoint/gui/spmover/.vscode/launch.json
vendored
Normal 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.
@@ -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.
|
|
3
Sharepoint/gui/spmover/readme.md
Normal file
3
Sharepoint/gui/spmover/readme.md
Normal 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.
|
@@ -12,13 +12,25 @@
|
|||||||
# Source : C:\Users\SebastienQUEROL\source\repos\sharepointmover-gui\Form1.Designer.cs
|
# Source : C:\Users\SebastienQUEROL\source\repos\sharepointmover-gui\Form1.Designer.cs
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
function Get-ScriptDirectory
|
###############Thread Setup
|
||||||
{ #Return the directory name of this script
|
|
||||||
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
|
|
||||||
Split-Path $Invocation.MyCommand.Path
|
|
||||||
}
|
|
||||||
|
|
||||||
$ScriptPath = Get-ScriptDirectory
|
$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
|
# Chargement des assemblies externes
|
||||||
Add-Type -AssemblyName System.Windows.Forms
|
Add-Type -AssemblyName System.Windows.Forms
|
||||||
@@ -32,6 +44,7 @@ $Mquestion = New-Object System.Windows.Forms.ToolStripMenuItem
|
|||||||
$MQuestionApropos = New-Object System.Windows.Forms.ToolStripMenuItem
|
$MQuestionApropos = New-Object System.Windows.Forms.ToolStripMenuItem
|
||||||
$MQuestionWiki = New-Object System.Windows.Forms.ToolStripMenuItem
|
$MQuestionWiki = New-Object System.Windows.Forms.ToolStripMenuItem
|
||||||
$Bgo = New-Object System.Windows.Forms.Button
|
$Bgo = New-Object System.Windows.Forms.Button
|
||||||
|
$BlistSites = New-Object System.Windows.Forms.Button
|
||||||
$CBsourceSite = New-Object System.Windows.Forms.ComboBox
|
$CBsourceSite = New-Object System.Windows.Forms.ComboBox
|
||||||
$CBdestSite = New-Object System.Windows.Forms.ComboBox
|
$CBdestSite = New-Object System.Windows.Forms.ComboBox
|
||||||
$progressBar1 = New-Object System.Windows.Forms.ProgressBar
|
$progressBar1 = New-Object System.Windows.Forms.ProgressBar
|
||||||
@@ -42,7 +55,7 @@ $tabs = New-Object System.Windows.Forms.TabControl
|
|||||||
$tabPage1 = New-Object System.Windows.Forms.TabPage
|
$tabPage1 = New-Object System.Windows.Forms.TabPage
|
||||||
$tabPage2 = New-Object System.Windows.Forms.TabPage
|
$tabPage2 = New-Object System.Windows.Forms.TabPage
|
||||||
$BconnectSP = New-Object System.Windows.Forms.Button
|
$BconnectSP = New-Object System.Windows.Forms.Button
|
||||||
$textBox1 = New-Object System.Windows.Forms.TextBox
|
$URLTenant = New-Object System.Windows.Forms.TextBox
|
||||||
$label3 = New-Object System.Windows.Forms.Label
|
$label3 = New-Object System.Windows.Forms.Label
|
||||||
$groupBox1 = New-Object System.Windows.Forms.GroupBox
|
$groupBox1 = New-Object System.Windows.Forms.GroupBox
|
||||||
$groupBox2 = New-Object System.Windows.Forms.GroupBox
|
$groupBox2 = New-Object System.Windows.Forms.GroupBox
|
||||||
@@ -98,28 +111,38 @@ $Bgo.TabIndex = 1
|
|||||||
$Bgo.Text = "GO"
|
$Bgo.Text = "GO"
|
||||||
$Bgo.UseVisualStyleBackColor = $true
|
$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
|
||||||
#
|
#
|
||||||
$comboBox1.FormattingEnabled = $true
|
$CBsourceSite.FormattingEnabled = $true
|
||||||
$comboBox1.Location = New-Object System.Drawing.Point(23, 44)
|
$CBsourceSite.Location = New-Object System.Drawing.Point(23, 44)
|
||||||
$comboBox1.Name = "comboBox1"
|
$CBsourceSite.Name = "CBsourceSite"
|
||||||
$comboBox1.Size = New-Object System.Drawing.Size(587, 21)
|
$CBsourceSite.Size = New-Object System.Drawing.Size(587, 21)
|
||||||
$comboBox1.TabIndex = 2
|
$CBsourceSite.TabIndex = 3
|
||||||
#
|
#
|
||||||
# CBdestSite
|
# CBdestSite
|
||||||
#
|
#
|
||||||
$comboBox2.FormattingEnabled = $true
|
$CBdestSite.FormattingEnabled = $true
|
||||||
$comboBox2.Location = New-Object System.Drawing.Point(23, 113)
|
$CBdestSite.Location = New-Object System.Drawing.Point(23, 113)
|
||||||
$comboBox2.Name = "comboBox2"
|
$CBdestSite.Name = "CBdestSite"
|
||||||
$comboBox2.Size = New-Object System.Drawing.Size(587, 21)
|
$CBdestSite.Size = New-Object System.Drawing.Size(587, 21)
|
||||||
$comboBox2.TabIndex = 3
|
$CBdestSite.TabIndex = 4
|
||||||
#
|
#
|
||||||
# progressBar1
|
# progressBar1
|
||||||
#
|
#
|
||||||
$progressBar1.Location = New-Object System.Drawing.Point(8, 369)
|
$progressBar1.Location = New-Object System.Drawing.Point(8, 369)
|
||||||
$progressBar1.Name = "progressBar1"
|
$progressBar1.Name = "progressBar1"
|
||||||
$progressBar1.Size = New-Object System.Drawing.Size(776, 23)
|
$progressBar1.Size = New-Object System.Drawing.Size(776, 23)
|
||||||
$progressBar1.TabIndex = 4
|
$progressBar1.TabIndex = 5
|
||||||
#
|
#
|
||||||
# label1
|
# label1
|
||||||
#
|
#
|
||||||
@@ -128,7 +151,7 @@ $label1.ForeColor = [System.Drawing.Color]::Black
|
|||||||
$label1.Location = New-Object System.Drawing.Point(23, 19)
|
$label1.Location = New-Object System.Drawing.Point(23, 19)
|
||||||
$label1.Name = "label1"
|
$label1.Name = "label1"
|
||||||
$label1.Size = New-Object System.Drawing.Size(41, 13)
|
$label1.Size = New-Object System.Drawing.Size(41, 13)
|
||||||
$label1.TabIndex = 5
|
$label1.TabIndex = 6
|
||||||
$label1.Text = "Source"
|
$label1.Text = "Source"
|
||||||
#
|
#
|
||||||
# label2
|
# label2
|
||||||
@@ -138,7 +161,7 @@ $label2.ForeColor = [System.Drawing.Color]::Black
|
|||||||
$label2.Location = New-Object System.Drawing.Point(23, 88)
|
$label2.Location = New-Object System.Drawing.Point(23, 88)
|
||||||
$label2.Name = "label2"
|
$label2.Name = "label2"
|
||||||
$label2.Size = New-Object System.Drawing.Size(60, 13)
|
$label2.Size = New-Object System.Drawing.Size(60, 13)
|
||||||
$label2.TabIndex = 6
|
$label2.TabIndex = 7
|
||||||
$label2.Text = "Destination"
|
$label2.Text = "Destination"
|
||||||
#
|
#
|
||||||
# tabs
|
# tabs
|
||||||
@@ -152,7 +175,7 @@ $tabs.Location = New-Object System.Drawing.Point(0, 27)
|
|||||||
$tabs.Name = "tabs"
|
$tabs.Name = "tabs"
|
||||||
$tabs.SelectedIndex = 0
|
$tabs.SelectedIndex = 0
|
||||||
$tabs.Size = New-Object System.Drawing.Size(800, 424)
|
$tabs.Size = New-Object System.Drawing.Size(800, 424)
|
||||||
$tabs.TabIndex = 7
|
$tabs.TabIndex = 8
|
||||||
#
|
#
|
||||||
# tabPage1
|
# tabPage1
|
||||||
#
|
#
|
||||||
@@ -161,8 +184,9 @@ $tabPage1.Controls.Add($label1)
|
|||||||
$tabPage1.Controls.Add($progressBar1)
|
$tabPage1.Controls.Add($progressBar1)
|
||||||
$tabPage1.Controls.Add($label2)
|
$tabPage1.Controls.Add($label2)
|
||||||
$tabPage1.Controls.Add($Bgo)
|
$tabPage1.Controls.Add($Bgo)
|
||||||
$tabPage1.Controls.Add($comboBox1)
|
$tabPage1.Controls.Add($BlistSites)
|
||||||
$tabPage1.Controls.Add($comboBox2)
|
$tabPage1.Controls.Add($CBsourceSite)
|
||||||
|
$tabPage1.Controls.Add($CBdestSite)
|
||||||
$tabPage1.Location = New-Object System.Drawing.Point(4, 22)
|
$tabPage1.Location = New-Object System.Drawing.Point(4, 22)
|
||||||
$tabPage1.Name = "tabPage1"
|
$tabPage1.Name = "tabPage1"
|
||||||
$tabPage1.Padding = New-Object System.Windows.Forms.Padding(3)
|
$tabPage1.Padding = New-Object System.Windows.Forms.Padding(3)
|
||||||
@@ -193,12 +217,13 @@ $BconnectSP.TabIndex = 0
|
|||||||
$BconnectSP.Text = "Connexion"
|
$BconnectSP.Text = "Connexion"
|
||||||
$BconnectSP.UseVisualStyleBackColor = $true
|
$BconnectSP.UseVisualStyleBackColor = $true
|
||||||
#
|
#
|
||||||
# textBox1
|
# URLTenant
|
||||||
#
|
#
|
||||||
$textBox1.Location = New-Object System.Drawing.Point(22, 55)
|
$URLTenant.Location = New-Object System.Drawing.Point(22, 55)
|
||||||
$textBox1.Name = "textBox1"
|
$URLTenant.Name = "URLTenant"
|
||||||
$textBox1.Size = New-Object System.Drawing.Size(325, 20)
|
$URLTenant.Text = "https://guycarlier.sharepoint.com"
|
||||||
$textBox1.TabIndex = 1
|
$URLTenant.Size = New-Object System.Drawing.Size(325, 20)
|
||||||
|
$URLTenant.TabIndex = 1
|
||||||
#
|
#
|
||||||
# label3
|
# label3
|
||||||
#
|
#
|
||||||
@@ -215,7 +240,7 @@ $label3.Text = "URL du tenant SharePoint"
|
|||||||
$groupBox1.Controls.Add($label4)
|
$groupBox1.Controls.Add($label4)
|
||||||
$groupBox1.Controls.Add($label3)
|
$groupBox1.Controls.Add($label3)
|
||||||
$groupBox1.Controls.Add($BconnectSP)
|
$groupBox1.Controls.Add($BconnectSP)
|
||||||
$groupBox1.Controls.Add($textBox1)
|
$groupBox1.Controls.Add($URLTenant)
|
||||||
$groupBox1.Location = New-Object System.Drawing.Point(8, 6)
|
$groupBox1.Location = New-Object System.Drawing.Point(8, 6)
|
||||||
$groupBox1.Name = "groupBox1"
|
$groupBox1.Name = "groupBox1"
|
||||||
$groupBox1.Size = New-Object System.Drawing.Size(473, 100)
|
$groupBox1.Size = New-Object System.Drawing.Size(473, 100)
|
||||||
@@ -280,7 +305,7 @@ $button1.Location = New-Object System.Drawing.Point(21, 29)
|
|||||||
$button1.Name = "button1"
|
$button1.Name = "button1"
|
||||||
$button1.Size = New-Object System.Drawing.Size(174, 23)
|
$button1.Size = New-Object System.Drawing.Size(174, 23)
|
||||||
$button1.TabIndex = 3
|
$button1.TabIndex = 3
|
||||||
$button1.Text = "Choix de l\'emplacement..."
|
$button1.Text = "Choix de l'emplacement..."
|
||||||
$button1.UseVisualStyleBackColor = $true
|
$button1.UseVisualStyleBackColor = $true
|
||||||
#
|
#
|
||||||
# checkBox1
|
# checkBox1
|
||||||
@@ -302,8 +327,19 @@ $label4.Location = New-Object System.Drawing.Point(380, 32)
|
|||||||
$label4.Name = "label4"
|
$label4.Name = "label4"
|
||||||
$label4.Size = New-Object System.Drawing.Size(66, 13)
|
$label4.Size = New-Object System.Drawing.Size(66, 13)
|
||||||
$label4.TabIndex = 3
|
$label4.TabIndex = 3
|
||||||
$label4.Text = "Déconnecté"
|
|
||||||
$label4.TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter
|
$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
|
||||||
#
|
#
|
||||||
@@ -340,9 +376,12 @@ $tabPage5.UseVisualStyleBackColor = $true
|
|||||||
$LresultsMove.HideSelection = $false
|
$LresultsMove.HideSelection = $false
|
||||||
$LresultsMove.Location = New-Object System.Drawing.Point(8, 173)
|
$LresultsMove.Location = New-Object System.Drawing.Point(8, 173)
|
||||||
$LresultsMove.Name = "LresultsMove"
|
$LresultsMove.Name = "LresultsMove"
|
||||||
|
#$LresultsMove.FullRowSelect = true
|
||||||
$LresultsMove.Size = New-Object System.Drawing.Size(776, 190)
|
$LresultsMove.Size = New-Object System.Drawing.Size(776, 190)
|
||||||
$LresultsMove.TabIndex = 7
|
$LresultsMove.TabIndex = 7
|
||||||
$LresultsMove.UseCompatibleStateImageBehavior = $false
|
$LresultsMove.AutoSize = $true
|
||||||
|
#$LresultsMove.MultiColumn = $false
|
||||||
|
#$LresultsMove.UseCompatibleStateImageBehavior = $false
|
||||||
#
|
#
|
||||||
# FMain
|
# FMain
|
||||||
#
|
#
|
||||||
@@ -353,7 +392,131 @@ $FMain.Controls.Add($menuStrip1)
|
|||||||
$FMain.ForeColor = [System.Drawing.Color]::Black
|
$FMain.ForeColor = [System.Drawing.Color]::Black
|
||||||
$FMain.MainMenuStrip = $menuStrip1
|
$FMain.MainMenuStrip = $menuStrip1
|
||||||
$FMain.Name = "FMain"
|
$FMain.Name = "FMain"
|
||||||
$FMain.Text = "SharePoint Manager GUI"
|
$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{
|
function OnFormClosing_FMain{
|
||||||
# $this parameter is equal to the sender (object)
|
# $this parameter is equal to the sender (object)
|
||||||
@@ -366,7 +529,14 @@ function OnFormClosing_FMain{
|
|||||||
($_).Cancel= $False
|
($_).Cancel= $False
|
||||||
}
|
}
|
||||||
|
|
||||||
$FMain.Add_FormClosing( { OnFormClosing_FMain} )
|
$FMain.Add_FormClosing({
|
||||||
|
#Disconnect-PnPOnline
|
||||||
|
Write-Host "Goodbye, come again soon :*"
|
||||||
|
$RunspacePool.Close()
|
||||||
|
$RunspacePool.Dispose()
|
||||||
|
[gc]::Collect()
|
||||||
|
OnFormClosing_FMain
|
||||||
|
})
|
||||||
|
|
||||||
$FMain.Add_Shown({$FMain.Activate()})
|
$FMain.Add_Shown({$FMain.Activate()})
|
||||||
$ModalResult=$FMain.ShowDialog()
|
$ModalResult=$FMain.ShowDialog()
|
Reference in New Issue
Block a user