Frank Dzaebel, erstellt am: 19.04.2006, zuletzt geändert: 19.04.2006
Kategorie: Sicherheit, .NET-Version: 1.1, [Download]
Dieser Artikel beschreibt, wie man mit Hilfe seines eigenen Sourcecodes erreichen kann, dass seine Anwendung dank zugeordneter Codegruppe mit „Full Trust“ ablaufen kann. Ein geringfügiger Nachteil liegt auf der Hand: Dieser Sourcecode muss selber zur Ausführung der Anweisungen berechtigt sein.
Der Artikel ist eine Portierung des Artikels von Matthias Schiffer. Statt des Kommandozeilenprogramms caspol.exe zur Erzeugung einer neuen Codegruppe mit „Full Trust“, kann auf Basis des Strong Name einer EXE der folgende Sourcecode eingesetzt werden.
private void button1_Click(object sender, System.EventArgs e)
{
CreateCodegroup("Meine Codegruppe", @"D:\DotNet\Test1\bin\Debug\Test1.exe", "Meine eigene Codegruppe!");
}
public void CreateCodegroup(string nameCodeGroup, string filenameStrongName)
{
CreateCodegroup(nameCodeGroup, filenameStrongName, null);
}
/// <summary>
/// Erzeugt eine Codegruppe mit dem Namen nameCodeGroup mit FullTrust,
/// Mitgliedsbedingung der in descriptionCodeGroup beschreibbaren Gruppe ist
/// der Strong Name der in filenameStrongName als Pfadangabe übergebenen Datei.
/// </summary>
/// <param name="nameCodeGroup"></param>
/// <param name="filenameStrongName"></param>
/// <param name="descriptionCodeGroup"></param>
public void CreateCodegroup(string nameCodeGroup, string filenameStrongName, string descriptionCodeGroup)
{
PolicyLevel pl=null, plMachine=null;
IEnumerator policyEnumerator = SecurityManager.PolicyHierarchy();
// Laufzeitsicherheitsrichtlinie "Computer" ermitteln
while (policyEnumerator.MoveNext())
{
pl = (PolicyLevel)policyEnumerator.Current;
if (pl.Label == "Machine")
{
plMachine = pl; break;
}
}
if (plMachine == null)
{
throw new SecurityException("Laufzeitsicherheitsrichtlinie 'Computer' nicht gefunden");
}
// Den Berechtigungssatz "Full Trust" ermitteln
NamedPermissionSet nps = plMachine.GetNamedPermissionSet("FullTrust");
PolicyStatement ps = new PolicyStatement(nps, PolicyStatementAttribute.Exclusive);
// Public Key der EXE-Datei als BLOB auslesen
Assembly asm = Assembly.LoadFrom(filenameStrongName);
// Strong Name Tool : http://MSDN.microsoft.com/de-de/library/k5b5tt23.aspx
// GetPublicKey : http://MSDN.microsoft.com/de-de/library/system.reflection.assemblyname.getpublickey.aspx
// Assembly signieren: http://MSDN.microsoft.com/de-de/library/xc31ft41.aspx
byte[] publicKey = asm.GetName().GetPublicKey();
if (publicKey == null)
{
throw new ArgumentException("Die Assembly hat keinen öffentlichen Schlüssel:\r\n"+
" '"+filenameStrongName+"'.\r\n"+
"Benutzen Sie das \"sn.exe\"-Tool, um die Assembly mit\r\n"+
"einem starken Namen zu versehen.");
}
StrongNamePublicKeyBlob publicKeyBlob = new StrongNamePublicKeyBlob(publicKey);
// Strong Name (hier ohne Namen und Versionsnummer)
// als Mitgliedschaftsbedingung verwenden:
IMembershipCondition mc = new StrongNameMembershipCondition(publicKeyBlob, null, null);
// Codegruppe erzeugen
CodeGroup cg = new UnionCodeGroup(mc, ps);
cg.Name = nameCodeGroup;
cg.Description = descriptionCodeGroup;
// Änderungen abspeichern
plMachine.RootCodeGroup.AddChild(cg);
SecurityManager.SavePolicyLevel(plMachine);
}