Announcement

Collapse
No announcement yet.

Exception: System.Security.Permissions.SecurityPermission

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Exception: System.Security.Permissions.SecurityPermission

    Wenn ich eine beliebige Komponente auf eine Windows.Net Form oder in eine VCL lege bekomme ich beim Programmstart folgende Fehlermeldung:
    "System.Security.Permissions.SecurityPermissio n, mscorlib ... ist fehlgeschlagen"

    Beispielprojekte funktionieren!

    Hat jemand ne gute Idee?

  • #2
    Wird des Programm von einem Netzlaufwerk gestartet?

    Wenn ja schlägt die .NET-Sicherheit zu: Alles was nicht vom Lokalen Laufwerk gestartet wird ist erstmal nur eingeschränkt erlaubt (und 'ne Exe schon gar nicht).

    Gehe in die Systemsteuerung, Verwaltung: Starte "Microsoft .NET Framework 1.1-Assistenten" und wähle ".NET Sicherheit anpassen". Änderungen an diesen Computer vornehmen, weiter und "Lokales Intranet" auf "Voll vertrauen" stellen. Jetzt dürfte es gehen

    Comment


    • #3
      Stimmt! Jetzt geht e

      Comment


      • #4
        Hallo,

        >...und "Lokales Intranet" auf "Voll vertrauen" stellen.

        Auf diese Brechstangen-Methode würde ich nur sehr kurzzeitig (zum Test) zurückgreifen, denn damit öffnet man im Sicherheitssystem von .NET einen Scheunentor.

        Besser ist es, die Rechte gezielt zu vergeben: <br>
        a) alle Assemblies, die mit dem eigenen Strong Name-Schlüssel signiert wurden, oder <br>
        b) alle Assemblies, die über einen bestimmten Pfad geladen werden, oder <br>
        c) jede betroffene Assembly einzeln.

        Die Version a) ist sowohl am sichersten als auch am bequemsten

        Comment


        • #5
          Hallo Andreas,

          zu a, Und wie bzw. wo kann man diesen Strong Name-Schlüssel einer Delphi8-Exe (in der IDE) mitgeben? Erzeugen konnte ich es mit

          sn -k "C:\TestStrongName.snk"
          (SN ist i.d.R. unter C:\Programme\Microsoft.NET\SDK\v1.1\Bin zu finden)

          zu b, Irgendwie habe ich diesen Fall mit dem .NET-Sicherheitsassisten/Konfiguration hinbekommen. Konnte immer nur c, eine bestimmte Assembly auswählen

          Comment


          • #6
            Hallo Bernhard,

            &gt;..wo kann man diesen Strong Name-Schlüssel einer Delphi8-Exe ...

            über die Assembly-Attribute, genauer gesagt über das Attribut <b>AssemblyKeyFile</b>:
            <pre>
            ...
            [assembly: AssemblyDelaySign(False)]
            [assembly: AssemblyKeyFile('ES.snk')]
            [assembly: AssemblyKeyName('')]
            ...
            </pre>
            Die SNK-Datei muss sich dabei im Projektverzeichnis befinden.

            &gt;...eine bestimmte Assembly auswählen

            Auf der Registerseite <i>Membership Condition</i> wird der Eintrag <b>Strong Name</b> für den <i>Condition Type</i> ausgewählt. Danach wählt man eine beliebige Assembly aus, die den gesuchten Strong Name-Schlüssel enthält. Danach werden die beiden Checkboxen <i>Name</i> und <i>Version</i> <b>abgewählt</b>, so dass nur der <i>Public Key</i> des Strong Names als Kriterium genutzt wird

            Comment


            • #7
              Danke Andreas,

              gibt es 'ne Möglichkeit diesen Strong Name im Rahmen einer Installation die entsprechenden Rechte (für diesen Computer/Benutzer) zu geben?

              P.S. Du hattes noch vergessen anzugeben das für diese Attribute die Unit " System.Reflection" einzubinden ist (Bei neuen Anwendungen wird diese zwar aufgenommen, aber nicht bei schon vorhandenen Projekten :-))

              Bernhar

              Comment


              • #8
                Hallo,

                &gt;im Rahmen einer Installation die entsprechenden Rechte zu geben.

                Ja - wobei dafür mehrere Wege zur Verfügung stehen (ich beschränke mich nur auf 2):

                1. Weg: Script über CASPOL.EXE

                <pre>
                caspol -machine -addgroup All_Code -strong -file signedassembly.exe
                FullTrust -name FouthCoffeeStrongName -description "Meine eigenen Assemblies sind sicher"
                </pre>

                2. Weg: System.Configuration.Install.Installer

                Eine Anwendung wird über ein MSI-Setup installiert, wobei das MSI-Setup in VS.NET so erweitert wird, dass eigener Code für das Anlegen der Code Group ausgeführt wird. Dazu wird ein Class Library-Projekt vorgesehen, dessen Klasse von <b>System.Configuration.Install.Installer</b> abstammt und zudem mit dem Attribut <b>[RunInstaller(true)]</B> gekennzeichnet wurde. Eine derartig gekennzeichnete Klasse wird vom MSI-Setup automatisch instanziert, so dass die eigene während des Setups ablaufende Programmfunktion im Konstruktor dieser Klasse abgelegt werden muss. Im zweiten Schritt wird diese Assembly im MSI-Projekt zur Liste der <b>Custom Actions</b> hinzugefügt. Auch hier führt der Weg über den <i>Solution Explorer | View | Customs Actions</i>. Über einen rechten Mausklick auf den Install-Ordnereintrag wird der <i>Add Custom Action</i>-Eintrag ausgewählt. Mit einem Doppelklick auf <i>Application Folder</i> wird dann <i>Add Output</i> aufgerufen, um die Class Library als <b>Primary Output</b> zu kennzeichnen.
                <br> <br>
                Das folgende Beispiel für das automatische Einrichten einer Code Group für die über den Strong Name gekennzeichneten Assemblies (StrongNameMembershipCondition) stammt direkt von Microsoft (MSDN).
                <pre>
                <b>using</b> System;
                <b>using</b> System.Collections;
                <b>using</b> System.ComponentModel;
                <b>using</b> System.Configuration.Install;
                <b>using</b> System.Security;
                <b>using</b> System.Security.Permissions;
                <b>using</b> System.Security.Policy;

                <b>namespace</b> ClassLibrary1
                {
                <font color="#003399"><i>/// </i></font>
                <font color="#003399"><i>/// Summary description for Installer1.</i></font>
                <font color="#003399"><i>/// </i></font>
                [RunInstaller(<b>true</b>)]
                <b>public</b> <b>class</b> Installer1 : System.Configuration.Install.Installer
                {
                <font color="#003399"><i>/// </i></font>
                <font color="#003399"><i>/// Required designer variable.</i></font>
                <font color="#003399"><i>/// </i></font>
                <b>private</b> System.ComponentModel.Container components = <b>null</b>;

                <b>public</b> Installer1()
                {
                <font color="#003399"><i>// This call is required by the Designer.</i></font>
                InitializeComponent();

                <font color="#003399"><i>// Award permissions</i></font>

                <font color="#003399"><i>// Generated with ‘secutil -c -s wahoo.exe’</i></font>
                <b>byte</b>[] publicKey = { 0, 36, 0, 0, 4, 128, 0, ....218 };

                <font color="#003399"><i>// Find the machine policy level</i></font>
                PolicyLevel machinePolicyLevel = <b>null</b>;
                System.Collections.IEnumerator ph = SecurityManager.PolicyHierarchy();

                <b>while</b>( ph.MoveNext() )
                {
                PolicyLevel pl = (PolicyLevel)ph.Current;
                <b>if</b>( pl.Label == <font color="#9933CC">&quot;Machine&quot;</font> )
                {
                machinePolicyLevel = pl;
                <b>break</b>;
                }
                }

                <b>if</b>( machinePolicyLevel == <b>null</b> ) <b>return</b>;

                <font color="#003399"><i>// Create a new code group giving Wahoo! Internet permissions</i></font>
                PermissionSet permSet1 = <b>new</b> NamedPermissionSet(<font color="#9933CC">&quot;Internet&quot;</font>);
                StrongNamePublicKeyBlob key = <b>new</b> StrongNamePublicKeyBlob(publicKey);
                IMembershipCondition membership1 = <b>new</b> StrongNameMembershipCondition(key, <b>null</b>, <b>null</b>);

                <font color="#003399"><i>// Create the code group</i></font>
                PolicyStatement policy1 = <b>new</b> PolicyStatement(permSet1);
                CodeGroup codeGroup1 = <b>new</b> UnionCodeGroup(membership1, policy1);
                codeGroup1.Description = <font color="#9933CC">&quot;Internet permissions for Sells Brothers Wahoo!&quot;</font>;
                codeGroup1.Name = <font color="#9933CC">&quot;Sells Brothers Wahoo!&quot;</font>;

                <font color="#003399"><i>// Add the code group</i></font>
                machinePolicyLevel.RootCodeGroup.AddChild(codeGrou p1);

                <font color="#003399"><i>// Create a new code group giving all of sellsbrothers.com Execute permission</i></font>
                PermissionSet permSet2 = <b>new</b> NamedPermissionSet(<font color="#9933CC">&quot;Execution&quot;</font>);
                IMembershipCondition membership2 = <b>new</b> SiteMembershipCondition(<font color="#9933CC">&quot;www.sellsbrothers.com&quot;</font>);

                <font color="#003399"><i>// Create the code group</i></font>
                PolicyStatement policy2 = <b>new</b> PolicyStatement(permSet2);
                CodeGroup codeGroup2 = <b>new</b> UnionCodeGroup(membership2, policy2);
                codeGroup2.Description = <font color="#9933CC">&quot;Minimal execute permissions for sellsbrothers.com&quot;</font>;
                codeGroup2.Name = <font color="#9933CC">&quot;sellsbrothers.com minimal execute&quot;</font>;

                <font color="#003399"><i>// Add the code group</i></font>
                machinePolicyLevel.RootCodeGroup.AddChild(codeGrou p2);

                <font color="#003399"><i>// Save changes</i></font>
                SecurityManager.SavePolicy();
                }

                <font color="990099">#region Component Designer generated code</font>
                <font color="#003399"><i>/// </i></font>
                <font color="#003399"><i>/// Required method for Designer support - do not modify</i></font>
                <font color="#003399"><i>/// the contents of this method with the code editor.</i></font>
                <font color="#003399"><i>/// </i></font>
                <b>private</b> <b>void</b> InitializeComponent()
                {
                components = <b>new</b> System.ComponentModel.Container();
                }
                <font color="990099">#endregion</font>
                }
                }
                </pre&gt

                Comment

                Working...
                X