Mittwoch, 6. November 2013

Import Certificate with PowerShell

Import Certificate in windows cert store using Powershell and X509Certificate2 class.

if (-not (dir cert:\currentuser\My | Where-Object {$_.Thumbprint -eq "5649d14b2abbafa50123456"})) {
    $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
    $cert.Import("c:\certs\Certificate.pfx","PlainTextPassword",[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"UserKeySet")
    $store = New-Object System.Security.Cryptography.X509Certificates.X509Store "My", "CurrentUser"
    $store.Open("ReadWrite")
    $store.Add($cert)
    $store.Close()
}

The original script has been copied from:
http://social.technet.microsoft.com/Forums/windowsserver/en-US/28bd6ad1-0627-420c-b995-1ab420710b54/automating-ca-certificate-installtion?forum=winserversecurity

Montag, 19. November 2012

Exceptions mal anders! Oder Messages mit Exceptions. ;-) Ein Antipattern.

Irgendwann hatten wir uns unterhalten ob man denn Exceptions nicht auch anders verwenden könnte.
Zum Beispiel für den Nachrichtenaustausch innerhalb einer Applikation.
Klingt skurril, ist skurril, aber gesagt, getan. Ich habe mich mal dran gesetzt und ein kleines Beispiel programmiert, dass den Normalfall sozusagen zur Ausnahme (Exception) werden lässt. 

Hier das Beispiel für einen kleinen Order-Service:
 //Als erstes eine Klasse Order
public class Order
{
    public int ID { get; set; }
    public string Comment { get; set; }
    public decimal Total { get; set; }
}

 //Dann eine Klasse OrderMessage als allgemeine Basisklasse für Benachrichtigungen über die Änderung an einer Order.
 public class OrderMessage : Exception
 {
     public Order Order { get; set; }
     public OrderMessage(Order order)
     {
         Order = order;
     }
 }

//Nun eine Klasse um speziell das Anlegen einer neuen Order zu Benachrichtigen
public class OrderCreatedMessage : OrderMessage
{
    public DateTime CreateDate { get; set; }
    public OrderCreatedMessage(Order order, DateTime createDate) 
    : base(order)
    {
        CreateDate = createDate;
    }
}

//Und hier der OrderService mit der Create Methode, die auch die OrderCreatedMessage auslöst.

public class OrderService
{
    public void Create()
    {
        var p = new Order() {ID = 10, Comment = "This is a new order.", 
        Total = 100.00m};
        throw new OrderCreatedMessage(p, DateTime.Now);
    }
}

//Verwenden kann man das Ganze nun so.
try
    {
        new OrderService().Create();
    }
    catch (OrderCreatedMessage orderCreated)
    {
        Console.WriteLine(orderCreated.CreateDate);
        throw;
    }
Das Schöne ist nun, dass man für beliebige Aktionen (natürlich auch für Ausnahmen) eine Nachricht definieren kann.
Die Nachricht (Exception) durchwandert den gesamten Call-Stack bis zum Aufrufer und kann an beliebigen Positionen innerhalb des Call-Stacks gefangen (catch) und behandelt werden.
Wenn die Nachricht gecatcht wurde, dann kann entweder eine neue Nachricht erzeugt oder die Nachricht mit einem einfachen throw weiter geleitet werden.
Eigentlich gar nicht so dumm?! ;-)
Man erspart sich das Verknüpfen von Events und es wird quasi vom Framewprk schon garantiert, dass die Nachricht den gesamten Call-Stack durchläuft.

Freitag, 10. Februar 2012

Use XPath expressions with Power Shell

Find all unique values within XML file and write output to file.

Select-Xml -path "Sample.xml" -xpath "/descendant::Lastname/text()" | foreach-object {$_.Node.Value} | sort | get-unique | out-file "out.txt"

Use it with XML namespaces

Select-Xml -path "Sample.xml" -xpath "/descendant::ns:StyleColorStatus/text()" -Namespace @{ns="http://SampleNamespace"} | foreach-object {$_.Node.Value} | sort | get-unique | out-file "c:\temp\out.txt"
 



Montag, 5. Dezember 2011

Powershell CSV Import und Ausgabe konvertieren

Importieren:
$fc = import-csv Input.txt  -delimiter ";" -header  "Knr","Anrede","Vorname","Nachname","Straße","PLZ","Stadt","Land"

Konvertieren und schreiben:
$fc | foreach {$_.Anrede+";"+$_.Nachname+";"+$_.Vorname+";"+$_.Straße+";"+$_.Land+
";"+$_.PLZ+";"+$_.Stadt} > Output.txt

Quicksort mit Linq

public void Sort(IEnumerable input, List acc)
{
    if (input.Count() <= 1) 

     { acc.AddRange(input); 
       return; 
     } 
     Sort(input.Where(n => n < input.First()), acc); 
     acc.AddRange(input.Where(n => n == input.First()));
     Sort(input.Where(n => n > input.First()), acc);
}

Mittwoch, 30. November 2011

Rename files with Power Shell

Remove extension:
gci *.deploy |%{rename-item $_.fullname -newname $_.basename}


Rename replace with expression:
gci *.jpg | rename-item -newname {$_.name -replace '^','ico_'}


Check results with whatif:
gci *.deploy |%{rename-item $_.fullname -newname $_.basename -whatif}
gci *.jpg | rename-item -newname {$_.name -replace '^','ico_'} -whatif

Source

Dienstag, 3. August 2010

C# in XSL

Skurril aber funktioniert, C# Code in XSL ausführen.
Wir kann man in XSL C# Code unterbringen und damit bei der Transformation scripten? Das war meine Frage, als ich mal wieder so abends zu Hause saß. Der BizTalk kann das ja mit seinen Funktoiden auch.
Ich habe dazu einen Artikel vom MSDN Magazin http://msdn.microsoft.com/en-us/magazine/cc302079.aspx gefunden.
Hier nun mal ein kleines Beispiel, das Namen und Vornamen der Personen in einer Datei speichert.
Zuerst die XML Datei.
<?xml version="1.0" encoding="utf-8"?>
<Personen>
  <Person>
    <Name>Müller</Name>
    <Vorname>Hans</Vorname>
  </Person>
  <Person>
    <Name>Meier</Name>
    <Vorname>Horst</Vorname>
  </Person>
  <Person>
    <Name>Funke</Name>
    <Vorname>Chsristian</Vorname>
  </Person>
</Personen>

Dann das XSL:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:script="urn:my-scripts"
    exclude-result-prefixes="msxsl">

  <msxsl:script language="C#" implements-prefix="script">
    <msxsl:using namespace="System.IO" />
    <![CDATA[
    public void WriteToFile(string s){
        File.AppendAllText("c://temp/Personen.txt",s);
    }
    ]]>
  </msxsl:script>

  <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/Personen">
      <xsl:for-each select="Person">
        <xsl:sort select="Name"/>
        <xsl:call-template name="Person" />
      </xsl:for-each>
    </xsl:template>

  <xsl:template name="Person">
    <xsl:value-of select="script:WriteToFile(concat(Name, Vorname))"/>
  </xsl:template>
</xsl:stylesheet>

Hier noch der Link zur MSDN zum msxml:script Tag:
Nun haben wir diese Funktionalität auch schon bei uns verwendet. Und, voila, es funktioniert perfekt.
Der C# Code lässt sich auch in einer extra Datei unterbringen. Dann kann man die Scripte für mehrere XSLs sharen.
Dazu kommt später noch ein Beispiel.
Wir haben übrigens eine Liste mit Artikeln und Lagercodes als XML gehabt. Diese Liste haben wir transformiert und für jeden Lagercode eine extra CSV Datei erstellt.
Es kam hier nicht auf Geschwindigkeit an.
Viel Spaß.