Affichage des articles dont le libellé est Powershell. Afficher tous les articles
Affichage des articles dont le libellé est Powershell. Afficher tous les articles

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)