2009-04-30 6 views
1

Meine Umgebung ist VS2005 C# Targeting Excel 2003. Ich gab mir eine kleine Dosis über das Vertrauen mit dem Installer dieses Add-Ins, als ich sah, dass ein .msi-Projekt war nur für mich innerhalb der Lösung erstellt. Unnötig zu sagen, das war der schwierigste Teil des gesamten Projekts und ich bin völlig darauf angewiesen, wie ich Full Trust für mein Add-In als Teil der Installation bereitstellen und einstellen kann.Excel-Add-In Installation und Einstellung .Net-Sicherheit/Vertrauen

Ich folgte dem sehr hilfreichen Beispiel von http://msdn.microsoft.com/en-us/library/aa537179(office.11).aspx - "Bereitstellen von Visual Studio 2005-Tools für Office-Lösungen mit Windows Installer: Walkthroughs (Teil 2 von 2)".

Es gab einige Ungenauigkeiten in diesem Dokument, aber wirklich kleine Dinge. Ich verwende ein VSTO 2005 Tools-Beispielprojekt, um die .net-Sicherheit als eine benutzerdefinierte Aktion der MSI festzulegen. Dies scheint zu funktionieren, erlaubt aber momentan nicht das Laden meines Plugins, es sei denn, ich ändere manuell ein paar Dinge mit dem .NET Framework Konfigurationstool. Nachdem die Installation abgeschlossen ist, sehe ich die entsprechenden Registrierungseinträge für Excel-Add-Ins und das entsprechende LoadBehavior von 0x03. Im Applet .Net 2.0 Framework-Konfiguration in der Systemsteuerung werden zwei Knoten zu meiner Laufzeit-Sicherheitsrichtlinie hinzugefügt.

Laufzeitsicherheitsrichtlinie -> Benutzer -> Codegruppen -> All_Code -> MyCodeGroup -> MyCodeGroupChild.

Die MyCodeGroup-Einstellungen sind auf URL-Validierung und Policylevel von NONE eingestellt. Die untergeordneten MyCodeGroup-Einstellungen sind STRONG NAME und stimmen mit dem überein, was ich für meine Add-In-DLL festgelegt habe.

In diesem Setup wird das Plugin nicht geladen. Wenn ich die "MyCodeGroup" Policy von None zu Full Trust ändern, funktioniert es. (Nachdem ich das Load Behavior meiner Registrierung von 0x02 zurück auf 0x03 zurückgesetzt habe).

Irgendwelche Ideen dazu? Ich habe nicht viel im Internet gefunden, um anzuzeigen, wo ich falsch liege.

+0

Dies scheint mit den PIA (primäre Interop Assembly) DLLs verwandt zu sein. Ich habe diese auf dem gleichen Pfad wie meine DLL installiert. Wenn ich THOSE eine URL-basierte Sicherheitseinstellung hinzufüge, kann ich das Plugin OK ausführen. Ich habe die Installation der PIA.msi und der VSTO.msi noch nicht angesprochen, aber ich dachte nicht, dass ich sie seit meiner Entwicklungsmaschine installiert haben müsste. Wenn ich diese nicht in die Installation einbeziehe, läuft meine App jedoch nicht. Ich bin nicht sicher, was ich zusätzlich tun müsste, um diese zu installieren. Ich bin mir sicher, dass ich das mehrmals außerhalb meiner Entwicklungsumgebung getan habe. –

+0

Sie können die PIA- und VSTO-Assemblys einfach normal installieren. Sie sollten die Sicherheit nicht speziell für diese festlegen müssen. ich tun würde (alle Büro schließen apps zuerst): 1. PIA installieren 2. VSTO Runtime installieren 3. Ihr Plug-in installieren 4. Stellen Sie die Sicherheit für Ihr Plug-in –

+0

die PIA nicht bündeln Sie und VSTO Runtime mit Ihrer App. Schließen Sie sie vom Projektaufbau aus. Microsoft bietet separate Installationsprogramme für Benutzer an, bei denen die Sicherheitsrichtlinien nicht separat festgelegt werden müssen. –

Antwort

1

Dan,

In meiner Erfahrung hat mich mit Caspol.exe fand der einfachste Weg, um Sicherheitspolitik zu setzen.

Zum Beispiel können Sie volles Vertrauen in alle DLLs in einem Ordner gewähren diesen Befehl: caspol -u -ag All_Code -url C: \ Ordnername \ Ordner * Fulltrust -n "Namen" -d "Beschreibung"

Überprüfen Sie in diesem MSDN-Artikel aus: http://msdn.microsoft.com/en-us/library/zdc263t0.aspx

Oder dieses auf CASPOL speziell: http://msdn.microsoft.com/en-us/library/cb6t8dtz.aspx

Oder Sie können Ihre eigenen C# Projekt rollen sie tun, um diesen Code als Grundlage verwenden: http://www.koders.com/csharp/fidDC5A2D42FE98AD20FFC65C4435785CDFE3CB5B10.aspx

das haben wir gemacht.

Auch wie in den Kommentaren: Schließen Sie die PIA und VSTO Runtime von Ihrem msi-Build (zu Referenzen im MSI-Projekt gehen, klicken Sie mit der rechten Maustaste und wählen Sie 'ausschließen') und installieren Sie sie separat. Klicken Sie einfach auf "Excel 2003 PIA Download" und "VSTO Runtime Download", um die Installationsprogramme zu erhalten. Lassen Sie alle Ihre Kunden diese vor Ihrer Anwendung installieren.

Auf diese Weise müssen Sie sich nur um die Sicherheit für Ihr Plugin kümmern.

0

Sie benötigen nur setsecurity, wenn Sie benutzerdefinierte Assemblys haben. Sie haben Recht, der Beispielcode funktioniert nicht, aber es muss eine kleine Änderung vorgenommen werden. lassen Sie mich wissen, wenn dieser Code für CaspolSecurityPolicyCreator ändern wird es beheben. (Sonst muss meine Originale vergleichen und herauszufinden, was der Unterschied ist) interne static void AddSecurityPolicy ( Bool machinePolicyLevel, String solutionCodeGroupName, String solutionCodeGroupDescription, String AssemblyPath, String assemblyCodeGroupName, String assemblyCodeGroupDescription) { String frameworkFolder = GetFrameworkFolder();

 string solutionInstallationLocation = Path.GetDirectoryName(assemblyPath); 
     string solutionInstallationUrl = Path.Combine(solutionInstallationLocation, "*"); 

     string policyLevel; 
     string parentCodeGroup; 
     if (machinePolicyLevel) 
     { 
      policyLevel = "-m"; // Use Machine-level policy. 
      parentCodeGroup = "My_Computer_Zone"; // Use My_Computer_Zone for assemblies installed on the computer. 
     } 
     else 
     { 
      policyLevel = "-u"; // Use User-level policy. 
      parentCodeGroup = "All_Code"; 
     } 

     // Add the solution code group. Grant no permission at this level. 
     string arguments = policyLevel + " -q -ag " + parentCodeGroup + " -url \"" + solutionInstallationUrl + "\" Nothing -n \"" + solutionCodeGroupName + "\" -d \"" + solutionCodeGroupDescription + "\""; 
     try 
     { 
      RunCaspolCommand(frameworkFolder, arguments); 
     } 
     catch (Exception ex) 
     { 
      string error = String.Format("Cannot create the security code group '{0}'.", solutionCodeGroupName); 
      throw new Exception(error, ex); 
     } 

     // Add the assembly code group. Grant FullTrust permissions to the main assembly. 
     try 
     { 
      // Use the assembly strong name as the membership condition. 
      // Ensure that the assembly is strong-named to give it full trust. 
      //AssemblyName assemblyName = Assembly.LoadFile(assemblyPath).GetName(); 
      //arguments = policyLevel + " -q -ag \"" + solutionCodeGroupName + "\" -strong -file \"" + assemblyPath + "\" \"" + assemblyName.Name + "\" \"" + assemblyName.Version.ToString(4) + "\" FullTrust -n \"" + assemblyCodeGroupName + "\" -d \"" + assemblyCodeGroupDescription + "\""; 

      //RunCaspolCommand(frameworkFolder, arguments); 
      //TODO- MS Hardcoded for now (better at assembly dll level use todo 1) 
      arguments = policyLevel + " -q -ag \"" + solutionCodeGroupName + "\" -url \"" + solutionInstallationUrl + "\" FullTrust -n \"" + assemblyCodeGroupName + "\" -d \"" + assemblyCodeGroupDescription + "\""; 
      RunCaspolCommand(frameworkFolder, arguments); 
      //TODO: 1 code below will create a separate group per assembly path, also need to check if AcnUI assembly is installed in GAC. 
      //AddFullTrust(frameworkFolder, assemblyPath, policyLevel, solutionCodeGroupName, assemblyCodeGroupName, assemblyCodeGroupDescription); 
     } 
     catch (Exception ex) 
     { 
      try 
      { 
       // Clean the solutionCodeGroupName. 
       RemoveSecurityPolicy(machinePolicyLevel, solutionCodeGroupName); 
      } 
      catch {} 

      string error = String.Format("Cannot create the security code group '{0}'.", assemblyCodeGroupName); 
      throw new Exception(error, ex); 
     } 
    } 

    internal static void RemoveSecurityPolicy(
     bool machinePolicyLevel, 
     string solutionCodeGroupName) 
    { 
     string frameworkFolder = GetFrameworkFolder(); 
     string policyLevel; 
     if (machinePolicyLevel) 
      policyLevel = "-m"; // Use Machine-level policy. 
     else 
      policyLevel = "-u"; // Use User-level policy. 

     string arguments = policyLevel + " -q -rg \"" + solutionCodeGroupName + "\""; 
     RunCaspolCommand(frameworkFolder, arguments); 
    } 

    private static string GetFrameworkFolder() 
    { 
     // Get the targeted Framework folder. 
     Version version = new Version(2, 0, 50727); 
     return GetRuntimeInstallationDirectory(version, true); 
    }