Scripting Powershell

Voici quelques exemples de scripts powershell 


#Récupère la clé produit de Windows
# Création de la table de conversion base 24 
$map="BCDFGHJKMPQRTVWXY2346789" 

# Lecture de la clé de registre 
$value = (get-itemproperty "HKLM:\\SOFTWARE\Microsoft\Windows NT\CurrentVersion").digitalproductid[0x34..0x42] 

# Conversion des valeurs en Hexa pour afficher le Raw Key $hexa = ""
$value | foreach {
  $hexa = $_.ToString("X2") + $hexa
}
Write-Output "Raw Key Big Endian: $hexa" 

# Calcul du Product Key 
$ProductKey = ""
for ($i = 24; $i -ge 0; $i--) {
  $r = 0
  for ($j = 14; $j -ge 0; $j--) {
    $r = ($r * 256) -bxor $value[$j]
    $value[$j] = [math]::Floor([double]($r/24))
    $r = $r % 24
  }
  $ProductKey = $map[$r] + $ProductKey 
  if (($i % 5) -eq 0 -and $i -ne 0) {
    $ProductKey = "-" + $ProductKey
  }
}
Write-Output "Product Key: $ProductKey"

# Script calculant la memoire libre de chaque disque logique
#création de l'instance de l'objet WMI
$elements = get-WmiObject Win32_LogicalDisk
$taille_totale = 0 # initialisation de la variable
# boucle pour parcourir tous les disques
foreach ( $disque in $elements ) {
    # calul de la taille en Giga octet
    $taille = $disque.freespace / (1024*1024*1024)
    $taille = [math]::round($taille, 1) # Arrondi la taille à 1 décimale

    $nom=$disque.Name
    $taille_totale = $taille_totale + $taille

    write-host "Le disque :$nom a $taille Go de disponible"
}
write-host "Taille disponible cumulée = $taille_totale Go"

ou

# get-freespace.ps1
param ($computer = ".")
# récupérer tous les disques logiques de l'ordinateur:
get-wmiobject -computer $computer win32_logicaldisk | where {$_.drivetype -eq 3} | tee-object -variable disques |
select-object @{e={$_.systemname};n="Système"},
              @{e={$_.name};n="Disque"},
              @{e={[math]::round($_.size/1GB,2)};n="Capacité (Go)"},
              @{e={[math]::round($_.freespace/1GB,1)};n="Disponible (Go)"}
              @{e={[math]::round(([int64]$_.freespace/[int64]$_.size*100),0)};n="(%)"}

Sleep 30

#Compress and zip file
function Compress-ToZip
{
    param([string]$zipfilename)

    if(-not (test-path($zipfilename)))
    {
        set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
        (Get-ChildItem $zipfilename).IsReadOnly = $false  
    }
     
    $shellApplication = new-object -com shell.application
    $zipPackage = $shellApplication.NameSpace($zipfilename)
     
    foreach($file in $input)
    {
         $zipPackage.CopyHere($file.FullName)
         Start-sleep -milliseconds 500
    }
}


#Copy and zip file
param ([string]$Workspace,[string]$BuildNumber,[string]$Exefilename,[string]$Issoutput,[string]$Zipfilename,[string]$Manualfiles,[string]$SMBUser,[string]$SMBPassword,[string]$ZipDestination)
$Source = "$Workspace\Temp"


#Nettoyage du workspace si besoin
If(Test-path $Source)
{
    Write-Host "Nettoyage de $Workspace Requis"
    Remove-Item -Path $Source -Force -Recurse -Confirm:$false
}


#Copie des Fichiers Nécessaires
$Date = Get-Date -format "yyyy-MM-dd"
$Zipfilename = "$Zipfilename$Date.$BuildNumber"
Write-Host "Création du dossier $Source\$Zipfilename"
mkdir -Path "$Source\$Zipfilename"
Write-Host "Copie de $Issoutput\$Exefilename.exe vers $Source\$Zipfilename"
Copy-Item -Path "$Issoutput\$Exefilename.exe" -Destination "$Source\$Zipfilename" -Force
#Write-Host "Copie de $Manualfiles\* vers $Source\$Zipfilename"
#Copy-Item -Path "$Manualfiles\*" -Destination "$Source\$Zipfilename" -Force -Recurse



#Zip des fichiers
Write-Host "Zip du répertoire $Source\$Zipfilename en $Zipfilename.zip"
Add-Type -As System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory( "$Source\$Zipfilename", "$Source\$Zipfilename.zip", "Optimal", $true )

#Copy du zip vers le partage réseau
Write-Host "Copie de $Source\$Zipfilename.zip vers $ZipDestination"
$secpasswd = ConvertTo-SecureString $SMBPassword -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ($SMBUser, $secpasswd)
New-PSDrive -Name M -PSProvider FileSystem -Root $ZipDestination -Credential $mycreds
Copy-Item -Path "$Source\$Zipfilename.zip" -Destination M: -Force
Remove-PSDrive M



#Envoi de fichier via winscp en powershell
#Variables SFTP
$serveurftp="X.X.X.X"
$userftp="user_ftp"
$pwdftp=":password"
# Debut du script
# liste des fichiers des répertoires PUT 
# Stocke cette liste dans la variables fichiers
$fichiers= dir E:\ftp\ADP\*\put\*
#préparation du script winscp d'envois
write-output "option batch on" |out-file $scriptdir\puttmp.scp -Encoding ASCII
write-output "option confirm off" |out-file $scriptdir\puttmp.scp -Encoding ASCII -append
#positionnement dans le répertoire de destination
write-output "cd $destdir" |out-file $scriptdir\puttmp.scp -Encoding ASCII -append
#pour chaque fichier contenu dans la liste fichiers
#crypte le fichier avec gnupg et l'ajoute dans le script sftp
foreach ($fichier in $fichiers){
    $nomfic=$fichier.name
    $nomdir=$fichier.directoryname
     #sauvegarde le fichier dans un rep archive et supprime le fichier .enc s'il éxiste déja
    cd $fichier.directoryname
    copy-item $fichier ..\archive
    remove-item $crypteddir\$nomfic.enc
    #cryptage du fichier
    write-output $pass|e:\gnupg\gpg --no-tty --batch --passphrase-fd 0 --quiet --yes -eas -u $gpguser -r $target -o $crypteddir\$nomfic.enc $fichier.fullname
    #création du fichier .ok
    new-item $crypteddir\$nomfic.enc.ok -type file -force
    #ajout du nom du fichier crypté dans le script sftp
    write-output "put $crypteddir\$nomfic.enc" |out-file $scriptdir\puttmp.scp -Encoding ASCII -append
    write-output "put $crypteddir\$nomfic.enc.ok" |out-file $scriptdir\puttmp.scp -Encoding ASCII -append
}
#finalisation du script sftp
write-output "exit" |out-file $scriptdir\puttmp.scp -append -Encoding ASCII
#Execution du script sftp
winscp3.exe /console /script=$scriptdir\puttmp.scp$userftp$pwdftp@$serveurftp



#Création d'un partage de dossier

Function New-Share([String] $Path,
                   [String] $Name,
                   [uint32] $Type,
                   [uint32] $MaximumAllowed,
                   [String] $Description,
                   [String] $Password,
                   #[System.Management.ManagementClass] $Access)
                   $Access)
{                
 if ($Access -ne $NULL)
     { if ($Access.__CLASS -ne "Win32_SecurityDescriptor")
      {Throw "Le paramètre Acces n'est pas une instance de la classe Win32_SecurityDescriptor"}
     }
    if ((Get-Service|where {$_.Name -eq "winmgmt"}).Status -eq "Stopped")
       {Throw "Le service d'infrastructure de gestion Windows (winmgmt) est arrêté. Impossible de continuer"}

    $Share = [WMIClass] "Win32_Share"
    if ($Share -eq $Null)
     {Throw "Erreur lors de la création d'une instance de la classe Win32_Share"}
 
    $CodeRetour=($Share.Create($Path,$Name,$Type,$MaximumAllowed,$Description,$Password,$Access)).ReturnValue
    Switch ($CodeRetour)
    {
        0   {$MsgErreur="Opération terminée correctement.";Break}
        2   {$MsgErreur="L'utilisateur n'a pas accès aux informations requises.";Break}
        8   {$MsgErreur="Échec inconnu.";Break}
        9   {$MsgErreur="Le nom du caractère ou du système de fichiers n'est pas valide.";Break}
        10  {$MsgErreur="La valeur spécifiée pour le paramètre de niveau est non valide.";Break}
        21  {$MsgErreur="Le paramètre spécifié est non valide.";Break}
        22  {$MsgErreur="Le nom du partage est déjà en cours d'utilisation sur ce serveur.";Break}
        23  {$MsgErreur="L'opération est non valide pour une ressource redirigée. Le nom de périphérique spécifié est
assigné à une ressource partagée.";Break}
        24  {$MsgErreur="Le périphérique ou le répertoire n'existe pas.";Break}
        25  {$MsgErreur="Le nom de partage n'existe pas.";Break}
        Default {$MsgErreur="Référez-vous à la documentation concernant les codes d'erreur Win32. Code erreur : $CodeRetour"}
    }
    if ($CodeRetour -ne 0) {Throw $MsgErreur}
    if ($Access -eq $NULL)
     { #Comportement par défaut avec WMI si on ne renseigne aucun ACL
      Write-Warning "Le share $Name a été créé avec le droit 'Full control' pour le groupe 'Tout le monde'."}
}


#Import de user via un csv AD (AD=Active directory)

Import-Module ActiveDirectory
$character = "@"
$objects= Import-Csv -Path C:\Windows\System32\DECIPLEX.csv -Delimiter ";"
foreach ($object in $objects){

$nom = $object.Lastname
$prenom = $object.Firstname
$departement = $object.department
$function = $object.function


New-ADOrganizationalUnit -Name $departement -Path "DC=deciplex,DC=lan"
New-ADGroup -Name $function -GroupScope Universal -Path "OU=$departement,DC=deciplex,DC=lan"
New-ADUser -SamAccountName $nom -Surname $prenom -UserPrincipalName $nom+"@deciplex.lan" -Name $nom -DisplayName $nom -GivenName $prenom -AccountPassword (ConvertTo-SecureString "P@ssword" -AsPlainText -force) -Enabled $True -ChangePasswordAtLogon $True -PassThru
Add-ADGroupMember -Identity "$function" -Member $nom

New-MailboxDatabase -Name "$departement" -server ‘srv’ -EdbFilePath c:\Mailboxdb\$departement.edb

Mount-Database -Identity Deciplex\$departement

Enable-Mailbox -Identity Deciplex\$nom -Database $departement

New-DistributionGroup -DisplayName $function -Name $function

Add-DistributionGroupMember -Identity $function -Member $nom

}


#Export de mailbox Exchange server
foreach ($i in (Get-Mailbox)) {

New-MailboxExportRequest -Mailbox $i -FilePath "\\ EGILIA-EXCH \ ExportsPST \$($i.Alias).pst" }


#MailTips Exchange
Set-OrganizationConfig -MailTipsAllTipsEnabled $true
Set-OrganizationConfig -MailTipsGroupMetricsEnabled $true
Set- OrganizationConfig MailTipsLargeAudienceThreshold 20
Set-Mailbox -MailTip "se mail ne sera pas envoyé"

#Ecrire dans un fichier XML
param ([string]$BuildNumber, [string]$ParametersIhmFile)

$Date = Get-Date -format "yyyy-MM-dd"
$FixedInVersion = "$Date.$BuildNumber"

Write-Host "affiche le contenu du fichier ParametersIhmFile " -foregroundcolor red -backgroundcolor blue
Get-Content -Path $ParametersIhmFile;

Write-Host "lecture du fichier ParametersIhmFile " -foregroundcolor red -backgroundcolor blue
[XML] $xmlDoc = Get-Content ($ParametersIhmFile);

Write-Host "ecriture des enfants parameters " -foregroundcolor red -backgroundcolor blue
$newXmlParameter = $xmlDoc.parameters.AppendChild($xmlDoc.CreateElement("parameter", $xmlDoc.DocumentElement.NamespaceURI));
$newXmlParameter.SetAttribute("name","release_number");

Write-Host "ecriture label " -foregroundcolor red -backgroundcolor blue
$newXmLabelElement = $newXmlParameter.AppendChild($xmlDoc.CreateElement("label"));
$newXmlLabelTextNode = $newXmLabelElement.AppendChild($xmlDoc.CreateTextNode("Release number"));

Write-Host "ecriture value date et du buildnumber " -foregroundcolor red -backgroundcolor blue
$newXmlValueElement = $newXmlParameter.AppendChild($xmlDoc.CreateElement("value"));
$newXmlValueTextNode = $newXmlValueElement.AppendChild($xmlDoc.CreateTextNode("$FixedInVersion"));

Write-Host "sauvegarde du fichier" -foregroundcolor red -backgroundcolor blue
$xmlDoc.Save($ParametersIhmFile);


#Ouvrir une page web via powershell
(new-object -com shell.application).ShellExecute('https://google.fr')


#Purge de fichier avec extension supérieur à 15 jours ".log"
$Now = Get-Date
$Days = "15"
$TargetFolder = "C:\*\log","C:\*\*\log","C:\inetpub\logs\LogFiles\W3SVC1"
$Extension = "*.log","*log20*"
$LastWrite = $Now.AddDays(-$Days)
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}

foreach ($File in $Files)
    {
    if ($File -ne $NULL)
        {
        write-host "Deleting File $File" -ForegroundColor "DarkRed"
        Remove-Item $File.FullName | out-null
        }
    else
        {
        Write-Host "No more files to delete!" -foregroundcolor "Green"
        }

    }




#Purge de fichier avec extension  ".log"
$Now = Get-Date
$LastWrite = $Now.AddDays(7)
$Files = get-childitem -Path "D:\Documents and Settings\*\Desktop\test" -include *.log -recurse |Where {$_.LastWriteTime -le "$LastWrite"}
foreach ($File in $Files){
if ($File) {
write-host "Deleting File '$File'"
Remove-Item $File | out-null
}

}


#Monitoring website ( en powershell v3 uniquement)
#The URI list to test
$URLListFile = "C:\URL.txt"
$URLList = Get-Content $URLListFile -ErrorAction SilentlyContinue
  $Result = @()
 
 
  Foreach($Uri in $URLList) {
  $time = try{
  $request = $null
   ## Request the URI, and measure how long the response took.
  $result1 = Measure-Command { $request = Invoke-WebRequest -Uri $uri }
  $result1.TotalMilliseconds
  }
  catch
  {
   <# If the request generated an exception (i.e.: 500 server
   error or 404 not found), we can pull the status code from the
   Exception.Response property #>
   $request = $_.Exception.Response
   $time = -1
  }
  $result += [PSCustomObject] @{
  Time = Get-Date;
  Uri = $uri;
  StatusCode = [int] $request.StatusCode;
  StatusDescription = $request.StatusDescription;
  ResponseLength = $request.RawContentLength;
  TimeTaken =  $time;
  }

}
    #Prepare email body in HTML format
if($result -ne $null)
{
    $Outputreport = "<HTML><TITLE>Website Availability Report</TITLE><BODY background-color:peachpuff><font color =""#99000"" face=""Microsoft Tai le""><H2> Website Availability Report </H2></font><Table border=1 cellpadding=0 cellspacing=0><TR bgcolor=green align=center><TD><B>URL</B></TD><TD><B>StatusCode</B></TD><TD><B>StatusDescription</B></TD><TD><B>ResponseLength</B></TD><TD><B>TimeTaken</B></TD</TR><TD><B>Check Appli</B></TD><TD><B>Comments</B></TD>"
    Foreach($Entry in $Result)
    {
        if($Entry.StatusCode -ne "200")
        {
            $Outputreport += "<TR bgcolor=red>"
        }
        else
        {
            $Outputreport += "<TR>"
        }
        $Outputreport += "<TD>$($Entry.uri)</TD><TD align=center>$($Entry.StatusCode)</TD><TD align=center>$($Entry.StatusDescription)</TD><TD align=center>$($Entry.ResponseLength)</TD><TD align=center>$($Entry.timetaken)</TD></TR>"
    }
    $Outputreport += "</Table></BODY></HTML>"
}

$Outputreport | out-file C:\WebsiteMonitoring.html

Invoke-Expression C:\WebsiteMonitoring.html



#Telecharger un fichier sur une page web
$url = "http://go.microsoft.com/fwlink/?LinkID=121721&arch=x86";
$file = "D:\Documents and Settings\*\My Documents\Downloads\32.exe";
$Wget = New-Object System.Net.WebClient
$Wget.DownloadFileAsync($url,$file)


#Auto login sur une page web
$url = "http://gfsgh.com"
$username="WSUSER"
$password="WSUSER"
$ie = New-Object -com internetexplorer.application;
$ie.visible = $true;
$ie.navigate($url);
while ($ie.Busy -eq $true)
{
Start-Sleep -Milliseconds 1000;
}
$ie.Document.getElementById(“LoginView1_Login1_UserName”).value = $username
$ie.Document.getElementById(“LoginView1_Login1_MyPassword”).value=$password
$ie.Document.getElementById(“LoginView1_Login1_LoginButton”).click();
$cmd.Quit();


ou

$Url = ""http://test vlskj.fr""
$Path = "C:\test"
$Username = "gkbln"
$Password = "fqdhgsglmkjdfxnmvml"

$WebClient = New-Object System.Net.WebClient
$WebClient.Credentials = New-Object System.Net.Networkcredential($Username, $Password)
$WebClient.DownloadFile( $url, $path )


#Connaitre quel user est connecté sur un ordinateur distant

$computer = Read-Host « Enter the computer Name »
$loginfo = Get-WmiObject -Computer $Computer -Class Win32_ComputerSystem
« Machine Name:  » + $loginfo.Name 
« User Name:  » + $loginfo.UserName

#Génération de mots de passe aléatoire
$Assembly = Add-Type -AssemblyName System.Web

[System.Web.Security.Membership]::GeneratePassword(8,3)



Aucun commentaire:

Enregistrer un commentaire