Надстройка Excel Установка и настройка .Net security / trust - PullRequest
1 голос
/ 01 мая 2009

Моей средой является VS2005 C #, ориентированная на Excel 2003. Я немного доверял установщику этой надстройки, когда увидел, что проект .msi создан специально для меня в рамках решения. Излишне говорить, что это была самая сложная часть всего проекта, и я полностью застрял в том, как развернуть и установить Full Trust для моей надстройки в процессе установки.

Я последовал очень полезному примеру из http://msdn.microsoft.com/en-us/library/aa537179(office.11).aspx - «Развертывание инструментов Visual Studio 2005 для решений Office с помощью установщика Windows: пошаговые руководства (часть 2 из 2)».

Кажется, в этом документе были некоторые неточности, но в действительности они были незначительными. Я использую пример проекта инструментов VSTO 2005 для настройки безопасности .net в качестве настраиваемого действия MSI. Кажется, это работает, но в настоящее время не позволяет загружать мой плагин, если я вручную не изменю некоторые вещи с помощью инструмента настройки .Net Framework. После завершения установки я вижу соответствующие записи реестра для надстроек Excel и соответствующее значение LoadBehavior 0x03. В апплете Конфигурация .Net 2.0 Framework на Панели управления я вижу 2 узла, добавленных в мою Политику безопасности времени выполнения.

Политика безопасности времени выполнения -> Пользователь -> Группы кодов -> All_Code -> MyCodeGroup -> MyCodeGroupChild.

Настройки MyCodeGroup установлены на валидацию URL-адреса и политический уровень NONE. Дочерними настройками MyCodeGroup являются STRONG NAME и они соответствуют тому, что я установил для своей dll надстройки.

В этой настройке плагин не будет загружаться. ЕСЛИ я меняю политику «MyCodeGroup» с None на Full Trust, она работает. (после того, как я сбросил свое поведение загрузки реестра с 0x02 до 0x03).

Есть идеи по этому поводу? Я не нашел много в Интернете, чтобы указать, где я иду не так.

Ответы [ 2 ]

1 голос
/ 07 мая 2009

Dan

По своему опыту я обнаружил, что использование CASPOL.exe является самым простым способом установки политики безопасности.

Например, вы можете предоставить полное доверие всем DLL в папке, используя эту команду: caspol -u -ag All_Code -url C: \ имя_папки \ имя_папки * FullTrust -n "Имя" -d "Описание"

Проверьте эту статью MSDN: http://msdn.microsoft.com/en-us/library/zdc263t0.aspx

Или этот на CASPOL конкретно: http://msdn.microsoft.com/en-us/library/cb6t8dtz.aspx

Или вы можете свернуть свой собственный проект c #, чтобы сделать это, используя этот код в качестве основы: http://www.koders.com/csharp/fidDC5A2D42FE98AD20FFC65C4435785CDFE3CB5B10.aspx

вот что мы сделали.

Также согласно комментариям: исключить PIA и VSTO Runtime из вашей сборки msi (перейдите по ссылкам в проекте msi, щелкните их правой кнопкой мыши и выберите «исключить») и установите их отдельно. Просто поищите инсталляторы в Google «Загрузка PIA Excel 2003» и «Загрузка VSTO Runtime». Попросите всех ваших клиентов установить их до вашего приложения.

Таким образом, вам нужно беспокоиться только о безопасности вашего плагина.

0 голосов
/ 20 октября 2009

Вам нужна только setsecurity, если у вас есть пользовательские сборки. Вы правы, пример кода не работает, но требует небольшого изменения. дайте мне знать, если это изменение кода для CaspolSecurityPolicyCreator это исправит. (еще нужно сравнить мои оригиналы и выяснить, в чем разница) внутренняя статическая пустота AddSecurityPolicy ( bool machinePolicyLevel, string solutionCodeGroupName, строка solutionCodeGroupDescription, строка assemblyPath, строка assemblyCodeGroupName, строка 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);
    }
...