Windows AMI mit deutscher Zeitzone

by fkollmann 6/13/2010 3:45:52 PM

Damit Windows VMs auf Amazon EC2 auch mit der deutschen Zeitzone (GMT+1, Amsterdam, Berlin, Bern, Rome, Rom, Stockholm, Vienna, Wien) arbeiten, muss vor dem Bundlen in der C:\Program Files\Amazon\Ec2ConfigService\sysprep2008.xml Datei der folgende Eintrag von…

<TimeZone>GMT Standard Time</TimeZone>

geändert werden in…

<TimeZone>W. Europe Standard Time</TimeZone>

Nach dem Bundlen hat dann jede Instanz automatisch die richtige Zeitzone.

Creating certificates using BouncyCastle

by fkollmann 7/16/2009 10:55:57 AM

For one of our projects we required some code to automatically…

  • generate a self-signed certificate,
  • ensure that it’s trusted, and
  • install it into the IIS webapp https:443.

To do this the following steps are performed – the following code has been simplified but shows the way:

0) Notes

  • BouncyCastle has been used to generate the key.
  • RandomGenerators is a helper class of us to generate some random data. It’s no big deal to implement them yourselves.
  • ServerManager is a type of "C:\Windows\System32\inetsrv\Microsoft.Web.Administration.dll"

1) Find existing certificate

var keyStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);

keyStore.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);

var certs = keyStore.Certificates.Find(
    X509FindType.FindBySubjectDistinguishedName,
    "CN=" + Environment.MachineName,
    true
    );

// find a valid key
X509Certificate2 cert = null;

foreach (var c in certs)
{
    // a private key is required
    if (!c.HasPrivateKey)
    {
        continue;
    }

    return cert;
}

2) Generate new certificate using BouncyCastle (if non was found)

var kpgen = new RsaKeyPairGenerator();

kpgen.Init(new KeyGenerationParameters(
    new SecureRandom(new CryptoApiRandomGenerator()),
    1024
    ));

var kp = kpgen.GenerateKeyPair();

var gen = new X509V3CertificateGenerator();

var certName = new X509Name("CN=" + Environment.MachineName);
var serialNo = BigInteger.ProbablePrime(120, RandomGenerators.CreateRandom());

gen.SetSerialNumber(serialNo);
gen.SetSubjectDN(certName);
gen.SetIssuerDN(certName);
gen.SetNotAfter(DateTime.Now.AddYears(1));
gen.SetNotBefore(DateTime.Now.Subtract(new TimeSpan(7, 0, 0, 0)));
gen.SetSignatureAlgorithm("MD5WithRSA");
gen.SetPublicKey(kp.Public);

gen.AddExtension(
    X509Extensions.AuthorityKeyIdentifier.Id,
    false,
    new AuthorityKeyIdentifier(
        SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(kp.Public),
        new GeneralNames(new GeneralName(certName)),
        serialNo
    ));

gen.AddExtension(
    X509Extensions.ExtendedKeyUsage.Id,
    false,
    new ExtendedKeyUsage(new ArrayList()
    {
        new DerObjectIdentifier("1.3.6.1.5.5.7.3.1")
    }));

var newCert = gen.Generate(kp.Private);

3) Import key to Windows keystore

private static X509Certificate2 ConvertToWindows(X509Certificate newCert, AsymmetricCipherKeyPair kp)
{
    var tempStorePwd = RandomGenerators.GetRandomString(50, 75);
    var tempStoreFile = new FileInfo(Path.GetTempFileName());

    try
    {
        // store key
        {
            var newStore = new Pkcs12Store();

            var certEntry = new X509CertificateEntry(newCert);

            newStore.SetCertificateEntry(
                Environment.MachineName,
                certEntry
                );

            newStore.SetKeyEntry(
                Environment.MachineName,
                new AsymmetricKeyEntry(kp.Private),
                new[] { certEntry }
                );

            using (var s = tempStoreFile.Create())
            {
                newStore.Save(
                    s,
                    tempStorePwd.ToCharArray(),
                    new SecureRandom(new CryptoApiRandomGenerator())
                    );
            }
        }

        // reload key
        return new X509Certificate2(tempStoreFile.FullName, tempStorePwd);
    }
    finally
    {
        tempStoreFile.Delete();
    }
}

4) Ensure the certificate is trusted

if (!cert.Verify())
{
    Console.WriteLine("Enforcing trust on certificate...");

    var keyStore = new X509Store(StoreName.AuthRoot, StoreLocation.LocalMachine);

    keyStore.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);

    try
    {
        keyStore.Add(cert);
    }
    finally
    {
        keyStore.Close();
    }
}

5) Bind the certificate to the IIS webapp

using (var sm = new ServerManager())
{
    foreach (var site in sm.Sites)
    {
        foreach (var bnd in site.Bindings)
        {
            if ((bnd.EndPoint.Port == 443) &&
                (bnd.Protocol == "https"))
            {
                site.Bindings.Remove(bnd);
                site.Bindings.Add(bnd.BindingInformation, cert.GetCertHash(), "MY");

                break;
            }
        }
    }

    // commit changes
    sm.CommitChanges();
}

 

UPDATE: Changes certificate serial number length form 64 bit to 120 bit to match Microsoft’s makecert default.
UPDATE2: There is a known issue: The certificate created here cannot be added to a binding after being created (via API and IIS7 Manager). The workaround is to always create a new certificate.

.NET 3.5 for Windows Server 2003/Windows Home Server

by fkollmann 2/2/2009 12:23:36 PM

Sam Wood recognized that .NET 3.5 is distributed via Windows Update on all Windows Server 2003 – including Windows Home Server.

Because of this the Router Control v1.1 CTP2 will be based on .NET 3.5 which will provide a more reliable backend communication using WCF (instead of WSE3).

Eine kurze Einführung in die Performanceanalyse (Vista/Server 2008)

by fkollmann 9/2/2008 12:00:25 PM

Steffen Krause hat eine nette Einführung geschrieben zur Performanceanalyse unter Windows Vista und Server 2008 geschrieben.

ARTIKEL

Windows Server 2008 Evaluation verlängern

by fkollmann 7/17/2008 10:28:00 AM

In letzter Zeit installiere ich neue Testumgebungen immer auf Windows Server 2008. Die Evaluierung kann insgesamt bis zu 240 Tagen dauern, dass ist für die meisten Sachen ausreichend. Allerdings muss hierzu nach 60 Tagen die Lizenz verlängert werden, wo sich nun die Frage stellt, wie das eigentlich geht.

Unter Windows Server 2008 x86 32bit geschieht dies mit:

c:\Windows\system32\slmgr -rearm

Und unter Windows Server 2088 x64 64bit geschieht dies mit:

c:\Windows\SysWOW64\slmgr -rearm

Wichtig ist, dies nicht zu früh zu tun, sondern wirklich abzuwarten, bis der Zeitraum (fast) abgelaufen ist. 

 

UPDATE: Artikel überarbeitet und x64 Unterstützung hinzugefügt.

Q: http://support.microsoft.com/kb/948472

Duplizierung von VMs (insb. in der Domäne)

by fkollmann 7/12/2008 6:07:00 PM

Häufig verwenden wir VMs zum Testen von neuen Produkten oder Testinstallationen. Dabei greift man der einfachhalthalber einfach auf eine fertige VM mit dem entsprechenden Betribessystem (als Trial) drauf zurück.

Leider handelt es hierbei um eine 100%ige Kopie. Das ist eiegntlich nicht schlimm, solange die VM für sich steht. Wenn diese aber Teil einer Domäne werden soll, wird es problematisch, da nämlich jede Installation ihren eigenen Security ID (SID) bekommt – so wie jeder Benutzer auch seinen eigenen hat.

Danach muss ggf. der Lizenzkey neu eingegeben und das Administrator Passwort neu festegelegt werden.

Daher muss für solche VMs ein neuer SID generiert werden. Hierzu gibt es zwei sehr einfache Wege:

 

Windows NT 4, Windows 2000, Windows XP und Windows Server 2003

NewSID (http://technet.microsoft.com/en-us/sysinternals/bb897418.aspx)

Windows Vista, Windows Server 2008

SysPrep (%WINDIR%\System32\Sysprep\Sysprep.exe; http://www.windowsvistaplace.com/sysprep-generalize-sid/windows-vista)

 

BTW: SysPrep gibt es auch für vorherige Versionen auf der Installations CD.

Team Foundation Server 2008 WebAccess auf 64 bit

by fkollmann 6/5/2008 3:58:00 PM

Wenn man den Team Foundation Server 2008 WebAccess auf einem Windows Server 2008 x64 installiert, dann bekommt man beim ersten Aufruf der Seite die Fehlermeldung, dass die Assembly Microsoft.TeamFoundation.Common und/oder Microsoft.TeamFoundation.WorkItemTracking.Client nicht gefunden werden kann.

Dies liegt daran, weil diese Assemblies nur in x86 verfügbar sind:

Die Lösung ist im IIS 7 denkbar einfach. Wir stellen einfach den .NET Framework für den Applikationspool des WebAccess Webanwendung auf 32bit um.

Hierzu öffnet man den IIS Manager und öffnet die erweiterten Eigenschaften des Applikationspools (normalerweise TswaPool1):

Nun einfach die 32bit Unterstützung aktivieren:

 

IIS6 und Kerberos Authentifizierung (HTTP 401.1)

by fkollmann 4/28/2008 12:08:00 PM

Bei immer mehr Kunden finden wir (sinnvollerweise) die Kerberos Authentifizierung im Einsatz. Leider gibt es damit ein Problem bzgl. der Application Pool Identity, da die Webapplikationen extra registriert werden müssen (Stichwort: SPN).

Nicht immer ist dies aber eine Option, insb. bei sehr großen Kunden, da hierzu Domain Administrator-Rechte notwendig sind. Es gibt aber die Alternative, bei der Authentifizierung nur NTLM zu nutzen.

Hierzu wird das Script adsutil.vbs verwendet, welches standardmäßig unter c:\Inetpub\AdminScripts zu finden ist:

cscript adsutil.vbs set w3svc/<WebApplikationsId>/root/<VirtuellesVerzeichnis/>NTAuthenticationProviders "NTLM"

WebApplikationsId: Die Zahl, die im IIS Manager unter Websites in der Spalte Bezeichner bzw. Identifier steht.
VirtuellesVerzeichnis: Wenn die Web-Applikation nicht im Root ("/") der Website liegt.

PS: Die Einstellung mit Kerberos lautet, statt "NTLM", "Negotiate,NTLM".

Q: http://support.microsoft.com/kb/215383

Desktop Suche 4.0 verfügbar

by fkollmann 4/1/2008 12:07:00 PM

Endlich ist die neue Desktop Suche verfügbar, die nun auch Remote Queries unterstützt (besonders interessant für die Home Server Nutzer): http://support.microsoft.com/kb/940157# .

Download: Windows XP + Sprachpaket, Windows Vista (inkl. Sprachpaket), Home Server + Sprachpaket

UPDATE: Falls es Probleme bei der Deinstalltion der alten Desktop Suche 3.01 geben sollte (spuninst.exe kann nicht gefunden werden), dann hilft das Tool WDS_3.01_Uninstall.

Windows SDK v6.1 (Windows Server 2008 und .NET Framework 3.5) verfügbar

by fkollmann 3/12/2008 12:05:00 PM