(0) exportieren Drucken
Alle erweitern
Erweitern Minimieren
Dieser Artikel wurde noch nicht bewertet - Dieses Thema bewerten.

Full Trust für Assemblies per Sourcecode

Veröffentlicht: 17. Mai 2005
Von Mathias Schiffer

In diesem MSDN Quickie zeigt Mathias Schiffer Ihnen, wie Sie per Sourcecode die Sicherheitsrichtlinien im .NET Framework modifizieren können.

Im MSDN Quickie „Full Trust für Assemblies mit caspol.exe“ haben Sie beispielhaft erfahren, wie Sie durch parametergesteuerten Aufruf des im .NET Framework enthaltene Kommandozeilen-Hilfsprogramms caspol.exe neue Codegruppen für die Zuteilung gegebener Ausführungsrechte anlegen können.

Dieser MSDN Quickie beschreibt analog, wie Sie mit Hilfe Ihres eigenen Sourcecodes erreichen, dass Ihre 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.

Im Beispielfall wird aus dem Reigen verschiedener Möglichkeiten zur Identifizierbarkeit einer Assembly diese mit einem „Starken Namen“ (Strong Name) versehen. Wie sie einen Strong Name zuweisen können, erfahren Sie bei Bedarf im Artikel „Full Trust für Assemblies mit caspol.exe“.

Statt des Kommandozeilenprogramms caspol.exe zur Erzeugung einer neuen Codegruppe mit „Full Trust“ auf Basis des Strong Name einer EXE können Sie den folgenden Sourcecode einsetzen:

CreateCodegroup(nameCodeGroup:="Meine Codegruppe", _
                    filenameStrongName:="D:\Programmpfad\MeineExe.exe", _
                    descriptionCodeGroup:="Meine eigene Codegruppe!")
  
  
  
  Public Sub CreateCodegroup(ByVal nameCodeGroup As String, _
                         ByVal filenameStrongName As String, _
                Optional ByVal descriptionCodeGroup As String = Nothing)
    ' 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.
    ' Der Code verwendet die folgenden Importe:
    ' Imports System.Security
    ' Imports System.Security.Permissions
    ' Imports System.Security.Policy
    ' Imports System.Reflection
    '
    Dim plMachine As PolicyLevel
    Dim policyEnumerator As IEnumerator = SecurityManager.PolicyHierarchy()
    Dim pl As PolicyLevel
  
    ' Lauzeitsicherheitsrichtlinie "Computer" ermitteln
    Do While policyEnumerator.MoveNext()
      pl = CType(policyEnumerator.Current, PolicyLevel)
      If pl.Label = "Machine" Then
        plMachine = pl
        Exit Do
      End If
    Loop
    If plMachine Is Nothing Then
      Throw New SecurityException("Laufzeitsicherheitsrichtlinie 'Computer' nicht gefunden")
    End If
  
    ' Den Berechtigungssatz "Full Trust" ermitteln
    Dim nps As NamedPermissionSet = plMachine.GetNamedPermissionSet("FullTrust")
    Dim ps As PolicyStatement _
        = New PolicyStatement(nps, PolicyStatementAttribute.Exclusive)
  
    ' Public Key der EXE-Datei als Blob auslesen
    Dim asm As [Assembly] = [Assembly].LoadFrom(filenameStrongName)
    Dim publicKey As Byte() = asm.GetName.GetPublicKey
    Dim publicKeyBlob As StrongNamePublicKeyBlob = New StrongNamePublicKeyBlob(publicKey)
  
    ' Strong Name (hier ohne Namen und Versionsnummer)
    ' als Mitgliedschaftsbedingung verwenden:
    Dim mc As IMembershipCondition = _
        New StrongNameMembershipCondition(publicKeyBlob, Nothing, Nothing)
  
    ' Codegruppe erzeugen
    Dim cg As CodeGroup = New UnionCodeGroup(mc, ps)
    cg.Name = nameCodeGroup
    cg.Description = descriptionCodeGroup
  
    ' Änderungen abspeichern
    Call plMachine.RootCodeGroup.AddChild(cg)
    Call SecurityManager.SavePolicyLevel(plMachine)
  
  End Sub

Natürlich können Sie diesen Sourcecode genauer auf Ihre Bedürfnisse hin anpassen. So können Sie statt vordefinierter Berechtigungssätze etwa neue Berechtigungssätze anlegen, eine andere Ebene der Laufzeitsicherheitsrichtlinien modifizieren (z.B. die Benutzerebene) oder andere Mitgliedschaftsbedingungen einsetzen.

Mathias Schiffer widmet sich als freier Softwareentwickler und Technologievermittler größeren Projekten ebenso wie arbeitserleichternden Alltagslösungen. Seit Jahren gibt er sein Wissen in unzähligen Publikationen auch an andere Entwickler und Entscheider weiter. Sie erreichen ihn per E-Mail an die Adresse Schiffer@mvps.org.


Anzeigen:
© 2014 Microsoft. Alle Rechte vorbehalten.