mardi 29 novembre 2011

[BATCH] Creer des archives automatique


Ce script permet de creer un systeme d'archive automatique avec 7zip.

Etapes :
-    Reading of : C:\ArchiveLog\ArchivePath.txt ( Le script doit être placé dans le même répertoire que le fichier ArchivePath.txt )
      This file contains all the path to analyze whether to extend archiving to a path that is where you can add it
- Deleting files older than 6 months in each directory.
- For the remaining files greater than two months they are zipped archive creates a directory in each directory scanned.
- The archive files greater than 6 months are deleted

Script :
@echo off
@For /F "tokens=1,2,3,4 delims=/ " %%A in ('Date /t') do @(
Set DayW=%%A
Set Day=%%B
Set Month=%%C
Set Year=%%D
Set All=%%A-%%B-%%C-%%D
)

@FOR /F "delims=|" %%i  IN (ArchivePath.txt) DO @(
mkdir %%i\ar
echo "##################- %All% DELETE OLD FILES IN MAIN DIR ##########################" >> %%i\log\%All%.log
Forfiles /P %%i /s /m *.* /d -180 /c "cmd /C echo @Path" >> %%i\log\%All%.log
Forfiles /P %%i /s /m *.* /d -180 /c "cmd /C del @Path"

echo "##################- %All% ZIP ##########################" >> %%i\log\%All%.log
Forfiles /P %%i /s /m *.* /d -60 /c "cmd /C "C:\7z.exe" a -tzip %%i\log\%All%-logs.zip @Path" >> %%i\log\%All%.log
Forfiles /P %%i /s /m *.* /d -60 /c "cmd /C del @Path"

echo "##################- %All% DELETE OLD ARCHIVES ##########################" >> %%i\log\%All%.log
Forfiles /P %%i\log /s /m *.* /d -180 /c "cmd /C del @Path"
)

lundi 28 novembre 2011

Envoie d'un mail en HTML


Cette fonction permet d'envoyer par mail un hashtable :

Exemple d'utilisation :
get-process | send-htmlemail - from test@test.com -to toto@test.com -subject "Process List"


function Send-HTMLEmail { 
#Requires -Version 2.0 
[CmdletBinding()] 
 Param  
   ([Parameter(Mandatory=$True, 
               Position = 1, 
               ValueFromPipeline=$true, 
               ValueFromPipelineByPropertyName=$true)] 
    $InputObject, 
    [Parameter(Mandatory=$True, 
               Position = 2, 
               HelpMessage="Please enter the To address")]     
    [Array]$To,     
    [Parameter(Mandatory=$True, 
               Position = 3, 
               HelpMessage="Please enter the Subject")] 
    [String]$Subject,                   
    [String]$From = "user@domain.org",     
    # Pretty table CSS is available for download 
    # http://gallery.technet.microsoft.com/scriptcenter/c63025ef-645d-4efe-a4c3-bc126cb939e8 
    [String]$CSS = "C:\PwShell\Html_Report.css", 
    [String]$SmtpServer ="smtp.server.com" 
   )#End Param 
 
$HTMLDetails = @{ 
    Title = $Subject 
    Head = (get-content -Path $CSS) 
    } 
    $htmlinfo = $InputObject | ConvertTo-Html @HTMLDetails 
 
$Splat = @{ 
    To         =$To 
    Body       ="$htmlinfo" 
    Subject    =$Subject 
    SmtpServer =$SmtpServer 
    From       =$From 
    BodyAsHtml =$True 
    } 
 
    Send-MailMessage @Splat 
     
}
Fichier CSS :
  Ma première page avec du style
  

vendredi 25 novembre 2011

[AD] LIster les membres d'un groupe



La difficulté quant on veut lister les membres d'un groupe dans l'AD est de prendre en compte la recursivité.

Ce script liste les membres d'un groupe et decompose les groupes qu'il contient. Le resultat est mis en forme automatiquement dans Excell.

Prérequis : ADCmdlets & Powershell


#################################################################################################
#      Script to retrieve users of all groups in a group       #
#################################################################################################



#################### Return the group name ####################
function GetGroupName ([string] $CNToGroup) {
 $end = $CNToGroup.IndexOf(",")
 $start = $CNToGroup.IndexOf("=") + 1
 $CNToGroup = $CNToGroup.Substring($start,$($end - $start))
 return $CNToGroup
}

####################  Recursive function to retrieve users and groups ####################
function recurseMemberOf ([string] $CN) {
 
 $GroupName = GetGroupName($CN)
 $members = Get-QADGroupMember -Identity $CN | where {$_.AccountIsDisabled -notmatch 'null' -and ($_.Type -eq 'user' -or $_.Type -eq 'group' -or $_.Type -eq 'contact')}
 
 if ($members -ne $NULL) { 
  foreach ($member in $members) {
   if ($member.Type -eq "user") {
    $script:Row += 1
    $wSheet.Cells.Item($script:Row,1) = $GroupName
    $GroupType = (Get-QADGroup -Identity $CN).GroupType
    if ($GroupType -ne $null) {
     $wSheet.Cells.Item($script:Row,2) = $GroupType.ToString()
    }
    $GroupMail = (Get-QADGroup -Identity $CN).email
    if ($GroupMail -ne $null) {
     $wSheet.Cells.Item($script:Row,3) = $GroupMail.ToString()
    }
    if ($member.FirstName -ne $null) {
     $wSheet.Cells.Item($script:Row,4) = $member.FirstName.ToString()
    }
    if ($member.LastName -ne $null) {
     $wSheet.Cells.Item($script:Row,5) = $member.LastName.ToString()
    }
    if ($member.SamAccountName -ne $null)
    {
     $wSheet.Cells.Item($script:Row,6) = $member.SamAccountName.ToString()
    }
    if ($member.email -ne $null)
    {
     $wSheet.Cells.Item($script:Row,7) = $member.email.ToString()
    }
    $ManagedBy = (Get-QADGroup -Identity $CN).ManagedBy
    if ($ManagedBy)
    {
     $wSheet.Cells.Item($script:Row,8) = $ManagedBy.ToString()
    }
   } else {
    if ($member.Type -eq "contact") {
     $script:Row += 1
     $wSheet.Cells.Item($script:Row,1) = $GroupName
     $GroupType = (Get-QADGroup -Identity $CN).GroupType
     if ($GroupType -ne $null) {
      $wSheet.Cells.Item($script:Row,2) = $GroupType.ToString()
     }
     $GroupMail = (Get-QADGroup -Identity $CN).email
     if ($GroupMail -ne $null) {
      $wSheet.Cells.Item($script:Row,3) = $GroupMail.ToString()
     }
     if ($member.type -ne $null)
     {
      $wSheet.Cells.Item($script:Row,6) = $member.type.ToString()
     }
     if ($member.name -ne $null)
     {
     $wSheet.Cells.Item($script:Row,7) = $member.name.ToString()
     }
    }
    else
    {
     #recurseMemberOf $member.DN
     $script:Row += 1
     $wSheet.Cells.Item($script:Row,1) = $GroupName
     $GroupType = (Get-QADGroup -Identity $CN).GroupType
     if ($GroupType -ne $null) {
      $wSheet.Cells.Item($script:Row,2) = $GroupType.ToString()
     }
     $wSheet.Cells.Item($script:Row,3) = $member.groupname.ToString()
     if ($member.type -ne $null)
     {
      $wSheet.Cells.Item($script:Row,6) = $member.type.ToString()
     }
     $groupmember = (Get-QADGroupMember $member).count
     if ($member.type -ne $null)
     {
      $wSheet.Cells.Item($script:Row,7) = $groupmember.ToString()
     }
    }
   }  
  } 
 }
 else
 {
  # Liste les groupes vide
  $script:Row += 1
  $wSheet.Cells.Item($script:Row,1) = $GroupName
  $GroupMail = (Get-QADGroup -Identity $CN).email
  if ($GroupMail -ne $null) {
   $wSheet.Cells.Item($script:Row,2) = $GroupMail.ToString()
  }
  $notmember = "Groupe Vide"
  $wSheet.Cells.Item($script:Row,2) = $notmember.ToString()
 }
}

#################### Main ####################

# Connect to AD
$credential = Get-Credential
Connect-QADService -service "DOMAIN" -Credential $credential

# Create Excel object
$Excel = New-Object -Com Excel.Application
$Excel.visible = $True
$Excel = $Excel.Workbooks.Add()
$wSheet = $Excel.Worksheets.Item(1)
$wSheet.Cells.Item(1,1) = "Group" 
$wSheet.Cells.Item(1,2) = "GroupType"
$wSheet.Cells.Item(1,3) = "GroupMail" 
$wSheet.Cells.Item(1,4) = "FirstName"
$wSheet.Cells.Item(1,5) = "LastName"
$wSheet.Cells.Item(1,6) = "Account"
$wSheet.Cells.Item(1,7) = "Email"
$wSheet.Cells.Item(1,8) = "ManagedBy"


# static variable
# Your static variable will also affect the console if you replace the prefix "script:" by "global:."
$script:Row = 1
$CNAME = "CNAME OF THE GROUP"
recurseMemberOf $CNAME

$range = $wsheet.usedRange
$range.EntireColumn.AutoFit() | out-null

Se connecter a une DB SQL et executer une query

Cette fonction se connecte a une DB SQL et retourne le resultat d'une query


Une fois configuré il suffit d'ajouter un alias dans son profils pour y avoir acces plus facilement ;-)


New-item -path alias:get-cmdb -value 


Script :

# Description : Ce script permet de faire des recherches dans une DB ( en l'occurence ici 
#
# Instructions: Copier sur un dossier de votre PC ( exemple c:\pwshell\get-cmdb.ps1 )
#    Ajouter cette ligne à votre fichier Profil : New-item -path alias:get-cmdb -value "PATH DE VOTRE SCRIPT"
#    Redemarrer votre session Powershell.
#
# Exemple : get-cmdb | ? {$_.name -match "toto"}
#
#
# ENTREE :  Nom du serveur
# SORTIE :  Hash Table


function sql_to_hash ([string]$query){
 $Database = NOM_DE_LA_DB
 $Server = SERVER
 $pwd = PASSWORD
 $Username = USERNAME
 $query = $query
 
 # Connect to SQL and query data, extract data to SQL Adapter
 $SqlQuery = $query
 $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
 $SqlConnection.ConnectionString = "Data Source=$Server;Initial Catalog=$Database;Trusted_Connection=False;User Id=$Username;Password=$pwd"
 $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
 $SqlCmd.CommandText = $SqlQuery
 $SqlCmd.Connection = $SqlConnection
 $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
 $SqlAdapter.SelectCommand = $SqlCmd
 $DataSet = New-Object System.Data.DataSet
 $nRecs = $SqlAdapter.Fill($DataSet)
 $nRecs | Out-Null
 
 #Populate Hash Table
 $objTable = $DataSet.Tables[0]
 $object = New-Object psobject
 $object = $objTable
 $object
}

$Server = $args[0]

if ($Server)
{
 $server = $Server.replace("*","%")   # Permet de faire des recherches groupes
}
if ( $Server -eq $null)
{
 $query = "
#AJOUTER UNE QUERY SQL LISTANT TOUT LES SERVEURS DE LA DB
}
else
{
$query = "
#AJOUTER UNE QUERY SQL EN AJOUTANT UNE CONDITION POUR QUE LE NOM DU SERVEUR SOIT EGALE A LA VARIABLE $server 

}

 sql_to_hash $query 

Trouver pourquoi un PC a redemarrer

Cette fonction sert a trouver pourquoi une machine a rebooté :
IN : MachineName

# Return all events about shutdown
#
# http://gallery.technet.microsoft.com/scriptcenter/496332b0-0e2d-4875-bcae-db8384512812

function Get-ShutdownReason { 
#Requires -Version 2.0             
[CmdletBinding()]             
 Param              
   (                        
    [Parameter(Mandatory=$true, 
               Position=1,                           
               ValueFromPipeline=$false,             
               ValueFromPipelineByPropertyName=$false)]             
    [Array]$Computer, 
    [Int]$Count = 4 
   )#End Param 
 
Begin             
{             
 Write-Host "`n Checking logs . . . " 
 $i = 0             
}#Begin           
Process             
{ 
 
$Computer | % { 
Get-EventLog -ComputerName $_ -LogName system -Source USER32 -Newest $Count | select TimeWritten, Username, Message # | fl 
} 
 
}#Process 
End 
{ 
 
}#End 
 
}
Get-ShutdownReason $args[0]