- PowerShell scripting fundamentals
- Task automation
- Scheduled tasks and jobs
- Advanced automation techniques
- Working Windows Server environment
- Basic PowerShell knowledge
- Administrative access
- Completed previous guides
-
Script Template
# Script: ServerMaintenance.ps1 [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string]$ServerName, [Parameter(Mandatory=$false)] [int]$LogRetentionDays = 30 ) # Error handling $ErrorActionPreference = "Stop" # Logging function function Write-Log { param($Message) $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" "$timestamp - $Message" | Out-File -FilePath "C:\Logs\Maintenance.log" -Append } # Main script logic try { Write-Log "Starting maintenance on $ServerName" # Your code here } catch { Write-Log "Error: $_" throw }
-
Best Practices
- Use parameters
- Implement error handling
- Add logging
- Include comments
-
File Operations
# Create directory structure $directories = @( "C:\Logs", "C:\Backups", "C:\Scripts" ) foreach ($dir in $directories) { if (-not (Test-Path $dir)) { New-Item -Path $dir -ItemType Directory } }
-
Service Management
# Check and restart services $services = @("Spooler", "PrintNotify") foreach ($service in $services) { $svc = Get-Service -Name $service if ($svc.Status -ne "Running") { Start-Service -Name $service Write-Log "Started service: $service" } }
-
Create Basic Task
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" ` -Argument "-File C:\Scripts\Maintenance.ps1" $trigger = New-ScheduledTaskTrigger -Daily -At 2AM $settings = New-ScheduledTaskSettingsSet -StartWhenAvailable Register-ScheduledTask -TaskName "ServerMaintenance" ` -Action $action ` -Trigger $trigger ` -Settings $settings
-
Advanced Task Configuration
# Create task with multiple triggers $triggers = @( (New-ScheduledTaskTrigger -Daily -At 2AM), (New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At 3AM) ) $action = New-ScheduledTaskAction -Execute "PowerShell.exe" ` -Argument "-File C:\Scripts\WeeklyMaintenance.ps1" Register-ScheduledTask -TaskName "WeeklyMaintenance" ` -Action $action ` -Trigger $triggers ` -Settings $settings
-
Start Background Job
$job = Start-Job -ScriptBlock { Get-Process | Where-Object CPU -gt 10 }
-
Monitor Job Status
# Check job status Get-Job -Id $job.Id | Select-Object State, HasMoreData # Get job results Receive-Job -Id $job.Id
-
Remote Session
# Create remote session $session = New-PSSession -ComputerName "Server01" # Execute command remotely Invoke-Command -Session $session -ScriptBlock { Get-Service | Where-Object Status -eq "Stopped" }
-
Remote File Operations
# Copy files to remote server Copy-Item -Path "C:\Scripts\*" -Destination "\\Server01\C$\Scripts" -Recurse
-
User Management
# Create multiple users $users = Import-Csv "C:\Scripts\NewUsers.csv" foreach ($user in $users) { New-ADUser -Name $user.Name ` -SamAccountName $user.SamAccountName ` -Department $user.Department ` -Enabled $true }
-
Group Management
# Add users to groups $groupMembers = Import-Csv "C:\Scripts\GroupMembers.csv" foreach ($member in $groupMembers) { Add-ADGroupMember -Identity $member.Group ` -Members $member.User }
-
Create Performance Report
# Collect performance data $perfData = Get-Counter -Counter "\Processor(_Total)\% Processor Time" ` -SampleInterval 1 ` -MaxSamples 60 # Export to CSV $perfData | Export-Csv -Path "C:\Reports\Performance.csv"
-
Disk Space Monitoring
# Check disk space Get-WmiObject Win32_LogicalDisk | Where-Object {$_.DriveType -eq 3} | Select-Object DeviceID, @{Name="FreeSpace(GB)";Expression={$_.FreeSpace/1GB}}, @{Name="TotalSize(GB)";Expression={$_.Size/1GB}}
-
Create HTML Report
# Generate HTML report $report = @" <html> <body> <h1>Server Status Report</h1> <p>Generated: $(Get-Date)</p> <h2>Services Status</h2> $(Get-Service | ConvertTo-Html) </body> </html> "@ $report | Out-File "C:\Reports\ServerStatus.html"
-
Email Report
# Send report via email $smtpServer = "smtp.company.com" $from = "reports@company.com" $to = "admin@company.com" Send-MailMessage -SmtpServer $smtpServer ` -From $from ` -To $to ` -Subject "Server Status Report" ` -BodyAsHtml ` -Body $report
-
Script Organization
C:\Scripts βββ Production β βββ Maintenance β βββ Monitoring β βββ Reporting βββ Development βββ Archive -
Documentation
# Add script documentation <# .SYNOPSIS Server maintenance script .DESCRIPTION Performs routine maintenance tasks .PARAMETER ServerName Target server name .EXAMPLE .\Maintenance.ps1 -ServerName "Server01" #>
-
Try-Catch Blocks
try { # Attempt operation Get-Service -Name "NonExistentService" } catch { # Log error Write-Log "Error: $_" # Take alternative action }
-
Error Logging
# Log errors to file $Error | ForEach-Object { "$(Get-Date) - $($_.Exception.Message)" | Out-File "C:\Logs\Errors.log" -Append }
- Use consistent naming
- Implement error handling
- Add logging
- Document code
- Test in development
- Use version control
- Monitor execution
- Review logs
- Use least privilege
- Secure credentials
- Validate input
- Audit access
- Review previous guides: