Sturbi's Home

  • Gallery
  • Modellflug
  • Datenschutz
  • Impressum

Blog

  • Allgemein (8)
    • Sprüche (6)
  • Computer (24)
    • Linux (16)
      • Nagios (5)
      • Nginx (4)
      • Postfix (3)
      • Subversion (1)
    • VMware (3)
    • Windows (8)
      • Powershell (7)
  • Fotografie (24)
  • Reise (7)
    • Hawaii (4)
    • Irland (1)
Wenn du etwas so machst,
wie du es seit zehn Jahren gemacht hast,
dann sind die Chancen groß,
daß du es falsch machst.

Charles F. Kettering amerikanischer Ingenieur * 29.08.1876, † 25.11.1958

E-Mail bei Powershell Script Abbruch

16. Februar 2021 by Sturbi Kategorie: Powershell

Wer Powershell Scripte über den Windows Taskplaner zur Sicherung einsetzt, möchte vielleicht auch informiert werden, wenn das Script mit einem nicht behandelten Fehler abbricht.

function Send-Mail ($message) {
    $emailSmtpServer = "smtp.domain.tld"
    $emailFrom = "taskplaner@domain.tld"
    $emailTo = "admin@domain.tld"
    $emailSubject = "Backup Script fail"

    Send-MailMessage -To $emailTo -From $emailFrom -Subject $emailSubject -Body $message -SmtpServer $emailSmtpServer
}

$ErrorActionPreference = 'stop'
trap { 
    $ErrorActionPreference = 'Continue'
    Send-Mail -message $_.Exception.Message
    break
}

# ... ab hier das eigentliche Script ...

pushalot mit Powershell

3. Januar 2015 by Sturbi Kategorie: Powershell, Windows

Da es in Powershell eine Implementation für REST gibt, muss man nicht den Umweg über den .NET WebClient gehen.

$json = @{
    AuthorizationToken = "44xx44x444x44xxxxx4xxx444x444xx";
    Body = "Body 12345....";
    Title = "Titel der Nachricht";
    Link = "https://www.google.de";
    LinkTitle = "Google";
    Source = "Powershell";
    TimeToLive = "60"
} | ConvertTo-Json

$uri = "https://pushalot.com/api/sendmessage"

Invoke-RestMethod -Method Post -Uri $uri -ContentType "application/json" -Body $json

 

Confluence mit Powershell via SOAP zugriefen

5. Januar 2014 by Sturbi Kategorie: Powershell, Windows

SOAP Dokumentation für Confluence:
https://docs.atlassian.com/atlassian-confluence/latest/com/atlassian/confluence/rpc/soap/ConfluenceSoapService.html

Webservice Objekt erstellen:

$confluence = New-WebServiceProxy -uri http://confluence.domain.tld/rpc/soap-axis/confluenceservice-v2?wsdl -namespace WebServiceProxy

Authentifizierungstoken erstellen:
$username = 'powershell'
$password = 'ak!$23Gx'
$token = $confluence.login($username,$password)

alle Spaces auflisten:
$confluence.getSpaces($token)

alle Seiten eines Spaces auflisten:
$confluence.getPages($token, "TestSpace")

eine Seite aus einem Space abrufen( hier die „Home“ Seite des Spaces):
$homepage = $confluence.getPage($token, "TestSpace", "Home")

der Content der Seite lässt sich über die Eigenschaft „content“ zugreifen:
$homepage.content

Anpassen und Speichern der Seite:
$homepage.content = "some new Text"
$confluence.storePage($token, $homepage)

Eine neue Seite erstellen und in der Linkansicht anzeigen:
$newpage = New-Object WebServiceProxy.RemotePage
$newpage.title = "Powershell Test Page"
$newpage.content = "Test with Powershell"
$newpage.space = "TestSpace"
$newpage.parentId = $homepage.id
$confluence.storePage($token, $newpage)

 

Credentials in Powershell aus KeePass laden

28. November 2013 by Sturbi Kategorie: Powershell, Windows

benötigt werden:

  • KeepPass http://keepass.com/
  • KeePassREST http://www.smartftp.com/keepassrest ( auf passende Version achten!)
  • ein Benutzerzertifikat im Windows Certificatestore z.B. von http://www.startssl.com/

Wir brauchen den Thumbprint des zu verwendenden Zertifikates:

dir cert:\CurrentUser\My

Die UUID des Eintrages aus der KeePass Datenbank

2D993D3EE140572AAC40F91804E3E383CC51BFAA

Der Code zum benutzen eines Usercertificate durch den Webclient ist von http://stackoverflow.com/questions/5621954/how-can-you-add-a-certificate-to-webclient-in-powershell

ACHTUNG:

Die Credentials stehen im Klartext in der Variable $keepasscred. Die Variable sollte so schnell wie möglich wieder gelöscht werden!

Remove-variable "keepasscred"

Zum Schluss haben wir mit $admincredentials ein Object vom Type System.Management.Automation.PSCredential

Hier der gesammte Code:

$def = @"
public class ClientCertWebClient : System.Net.WebClient
{
   System.Net.HttpWebRequest request = null;
   System.Security.Cryptography.X509Certificates.X509CertificateCollection certificates = null;

    protected override System.Net.WebRequest GetWebRequest(System.Uri address)
    {
        request = (System.Net.HttpWebRequest)base.GetWebRequest(address);
        if (certificates != null)
        {
            request.ClientCertificates.AddRange(certificates);
        }
        return request;
    }

    public void AddCerts(System.Security.Cryptography.X509Certificates.X509Certificate[] certs)
    {
        if (certificates == null)
        {
            certificates = new System.Security.Cryptography.X509Certificates.X509CertificateCollection();
        }
        if (request != null)
        {
            request.ClientCertificates.AddRange(certs);
        }
        certificates.AddRange(certs);
    }
}
"@

Add-Type -TypeDefinition $def

$wc = New-Object ClientCertWebClient
$certs = dir cert:\CurrentUser\My | ?{$_.Thumbprint -eq "2D993D3EE140572AAC40F91804E3E383CC51BFAA"}
$wc.AddCerts($certs)
$keepasscred = $wc.DownloadString("https://localhost:12984/keepass/entry/70B660CF23658D4C8F24B60B17017372") | ConvertFrom-Json

$username = $keepasscred.Username
$password = $keepasscred.Password
$admincredentials = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,(ConvertTo-SecureString -String $password -AsPlainText -Force))

# remove all temporary variables with Cleartextpasswords!
Remove-Variable "keepasscred"
Remove-Variable "username"
Remove-Variable "password"

 

Exchange Message Header cleanup in Postfix

19. Juli 2012 by Sturbi Kategorie: Linux, Postfix, Windows

Wer sich mal den Header seiner ausgehenden E-Mail angesehen hat, wird vielleicht mit Schrecken festgestellt haben, das Exchange Server dort etwas zu gesprächig sind.
Da man für eine DKIM Signatur am besten noch ein ausgehendes Relay zwischen Exchange und Internet schaltet, kann man mit Postfix sehr schnell für Abhilfe schaffen.
Die DKIM Signatur erfolgt nach der Verarbeitung der „header_checks“, wir können hier also noch beliebig ändern.

Zuerst ersetze ich die „Received“ Zeile der Übertragung vom Exchange Server an das Postfix Relay mit einem Eintrag von localhost. Hier kann man auch einen beliebigen anderen MTA z.B. Exim eintragen. Er sollte nur nicht zu fantasievoll sein, Antispam Systeme sind nachtragend. Das gilt auch für die unbedingt richtige Syntax! (MessageID und Uhrzeit)

Dann werden alle X-Header mit Verweisen auf interne IP Adressen gelöscht.

Zuletzt lösche ich noch X-Header mit Verweisen auf den User-Agent, Antivirus und Antispam und wer sich da sonst noch einträgt.
Benutzt man z.B. OTRS, sollte man hier unbedingt den X-Header mit der Software Versionsnummer löschen, aber den X-Header mit der Ticketnummer lassen.

zum testen legt man sich ein Mailkonto bei hotmail an und schaut sich dort den Quelltext der E-Mail an.

 

header_checks = pcre:/etc/postfix/header_checks

 
/^Received: from exchange.intern.sturbi.de (.*) with ESMTP id ([A-F[:digit:]]+)(.*)/    REPLACE Received: from [127.0.0.1] (localhost [127.0.0.1]) by [127.0.0.1] (Postfix) with ESMTP id $2 $3
/^Received: (.*)192\.168/       IGNORE
/^Received: (.*)10\.0/  IGNORE
/^Received: (.*)172\./  IGNORE
/^X-Virus/ IGNORE
/^X-Mailer/ IGNORE
/^User-Agent/ IGNORE
/^X-MS-Has-Attach/ IGNORE
/^X-MS-TNEF-Correlator/ IGNORE
/^X-OLX-Disclaimer/ IGNORE
/^X-Powered-BY: OTRS/ IGNORE
/^X-Virus/              IGNORE
/^X-Mailer/             IGNORE
/^User-Agent/           IGNORE
/^X-MS/      IGNORE
/^x-originating-ip/      IGNORE

Pimp my Powershell Environment

19. Juli 2012 by Sturbi Kategorie: Powershell, Windows

Hier einmal meine Microsoft.PowerShell_profile.ps1

Wichtig ist mir vor allem, das die Powershell schnell startet. Also möglicht wenige Module laden.
Zum schnellen Nachladen der einzelnen Module habe ich die Aufrufe in Funktionen verpackt, welche sich über „load-XXX“ aufrufen lassen.(siehe Script loads.ps1)
Das Quest Active Directory  wird standardmäßig geladen. Bits benötigt kaum Zeit zum laden und ich benutze es gern um Downloads durchzuführen.

Meine lokalen Scripte lege ich im Ordner $lib ab.

Als Editor verwende ich überwiegend Notepad++, welcher über den alias e aufgerufen wird.

Um über die Command Line Dateien via scp zu kopieren benutze ich das Client Pack von VanDyke.
Meine SSH Verbindungen rufe ich über Funktionen im Script ssh.ps1 auf. An Stelle von SecureCRT kann man auch mit Putty arbeiten.

Mit den Funktionen „big“ und „small“ kann ich schnell die Konsole in ihrer Größe verändern, ohne die Maus zu bemühen.

Add-PSSnapin Quest.ActiveRoles.ADManagement
Import-Module BitsTransfer

$lib = "C:\data\PowerShell\lib\"

set-alias -Name vi -Value "C:\Program Files (x86)\Vim\vim73\vim.exe" -Force
set-alias -Name Edit-File -Value "C:\Program Files (x86)\Notepad++\notepad++.exe" -Force
set-alias -Name e -Value "C:\Program Files (x86)\Notepad++\notepad++.exe" -Force

Set-Alias -Name scp -Value "C:\Program Files\VanDyke Software\ClientPack\vcp" -Force
Set-Alias -Name ssh -Value "C:\Program Files\VanDyke Software\ClientPack\vsh" -Force

. "C:\data\PowerShell\lib\ssh.ps1"
. "C:\data\PowerShell\lib\loads.ps1"

$env:PSModulePath = "$env:PSModulePath;C:\data\powershell\Modules\"

function global:prompt {
    # our theme
    $cdelim = [ConsoleColor]::DarkCyan
    $chost = [ConsoleColor]::Green
    $cloc = [ConsoleColor]::Cyan

    write-host "$([char]0x0A7) " -n -f $cloc
    write-host ([net.dns]::GetHostName()) -n -f $chost
    write-host ' {' -n -f $cdelim
    # write-host (shorten-path (pwd).Path) -n -f $cloc
	write-host (pwd).Path -n -f $cloc
    write-host '}'  -f $cdelim
	Write-Host ":~#" -NoNewline -ForegroundColor $cdelim
    return ' '
}

function big(){

$pshost = get-host
$pswindow = $pshost.ui.rawui

$newsize = $pswindow.buffersize
$newsize.height = 3000
$newsize.width = 180
$pswindow.buffersize = $newsize

$newsize = $pswindow.windowsize
$newsize.height = 80
$newsize.width = 180
$pswindow.windowsize = $newsize
}

function small(){

$pshost = get-host
$pswindow = $pshost.ui.rawui

$newsize = $pswindow.windowsize
$newsize.height = 24
$newsize.width = 80
$pswindow.windowsize = $newsize

$newsize = $pswindow.buffersize
$newsize.height = 24
$newsize.width = 80
$pswindow.buffersize = $newsize
}

function load-PowerTabe()
{
	Import-Module "PowerTab" -ArgumentList "C:\data\powershell\Modules\PowerTab\PowerTabConfig.xml"
	$PowerTabConfig.DefaultHandler = "Intellisense"
	$PowerTabConfig.DoubleBorder = $False
}

function load-PSCX()
{
	Import-Module Pscx
}

function load-Exchange()
{
	. 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto
}

function load-Sharepoint()
{
	$ver = $host | select version
	if ($ver.Version.Major -gt 1)  {$Host.Runspace.ThreadOptions = "ReuseThread"}
	Add-PsSnapin Microsoft.SharePoint.PowerShell
	Set-location $home
}

function load-SQL()
{
	$ErrorActionPreference = "Stop"

	$sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"

	if (Get-ChildItem $sqlpsreg -ErrorAction "SilentlyContinue")
	{
		throw "SQL Server Provider for Windows PowerShell is not installed."
	}
	else
	{
		$item = Get-ItemProperty $sqlpsreg
		$sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
	}

	#
	# Set mandatory variables for the SQL Server provider
	#
	Set-Variable -scope Global -name SqlServerMaximumChildItems -Value 0
	Set-Variable -scope Global -name SqlServerConnectionTimeout -Value 30
	Set-Variable -scope Global -name SqlServerIncludeSystemObjects -Value $false
	Set-Variable -scope Global -name SqlServerMaximumTabCompletion -Value 1000

	#
	# Load the snapins, type data, format data
	#
	Push-Location
	cd $sqlpsPath
	Add-PSSnapin SqlServerCmdletSnapin100
	Add-PSSnapin SqlServerProviderSnapin100
	Update-TypeData -PrependPath SQLProvider.Types.ps1xml 
	# update-FormatData -prependpath SQLProvider.Format.ps1xml 
	Pop-Location

	#
	# Loads the SQL Server Management Objects (SMO)
	#

	$ErrorActionPreference = "Stop"

	$sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"

	if (Get-ChildItem $sqlpsreg -ErrorAction "SilentlyContinue")
	{
		throw "SQL Server Provider for Windows PowerShell is not installed."
	}
	else
	{
		$item = Get-ItemProperty $sqlpsreg
		$sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
	}

	$assemblylist = 
	"Microsoft.SqlServer.Management.Common",
	"Microsoft.SqlServer.Smo",
	"Microsoft.SqlServer.Dmf ",
	"Microsoft.SqlServer.Instapi ",
	"Microsoft.SqlServer.SqlWmiManagement ",
	"Microsoft.SqlServer.ConnectionInfo ",
	"Microsoft.SqlServer.SmoExtended ",
	"Microsoft.SqlServer.SqlTDiagM ",
	"Microsoft.SqlServer.SString ",
	"Microsoft.SqlServer.Management.RegisteredServers ",
	"Microsoft.SqlServer.Management.Sdk.Sfc ",
	"Microsoft.SqlServer.SqlEnum ",
	"Microsoft.SqlServer.RegSvrEnum ",
	"Microsoft.SqlServer.WmiEnum ",
	"Microsoft.SqlServer.ServiceBrokerEnum ",
	"Microsoft.SqlServer.ConnectionInfoExtended ",
	"Microsoft.SqlServer.Management.Collector ",
	"Microsoft.SqlServer.Management.CollectorEnum",
	"Microsoft.SqlServer.Management.Dac",
	"Microsoft.SqlServer.Management.DacEnum",
	"Microsoft.SqlServer.Management.Utility"

	foreach ($asm in $assemblylist)
	{
		$asm = [Reflection.Assembly]::LoadWithPartialName($asm)
	}

	Push-Location
	cd $sqlpsPath
	update-FormatData -prependpath SQLProvider.Format.ps1xml 
	Pop-Location

}

function load-VMWare()
{
	# Adds the base cmdlets
	Add-PSSnapin VMware.VimAutomation.Core
	# Add the following if you want to do things with Update Manager
	Add-PSSnapin VMware.VumAutomation
	# This script adds some helper functions and sets the appearance. You can pick and choose parts of this file for a fully custom appearance.
	# . "C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-VIToolkitEnvironment.ps1"

	. "C:\Program Files (x86)\VMware\Infrastructure\vSphere PowerCLI\Scripts\Initialize-PowerCLIEnvironment.ps1"
	Connect-VIServer -Server vcenter
}

function load-EQL()
{
	Import-Module -name "C:\Program Files\EqualLogic\bin\EqlPSTools.dll"
}

function telnet-switch-iscsi-1{
	& "C:\Program Files\VanDyke Software\Clients\SecureCRT.exe" /T /TELNET 192.168.9.221
}

function ssh-hermes{
	& "C:\Program Files\VanDyke Software\Clients\SecureCRT.exe" /T /SSH2 wutz@10.0.10.5
}

function ssh-hermine{
	& "C:\Program Files\VanDyke Software\Clients\SecureCRT.exe" /T /SSH2 wutz@hermine
}

 

 

 

 

  • 1
  • 2
  • Nächste Seite »

© 2021 · Sturbi's Home