Report Viewer 2010, выпуск об учетных записях без прав администратора

Я использовал элемент управления ReportViewer в своем приложении Winforms. В отчетах содержатся некоторые выражения, поэтому он пытается создать сборки «выражения узла» во временной папке. Если я не запустил программу с правами администратора (т.е. щелкните правой кнопкой мыши, выберите «Запуск от имени администратора ...»), я получу это сообщение об ошибке:

  

"Доступ к пути   C: \ Users \ user \ AppData \ Local \ Temp \ expression_host_351sf52dsf5.dll   отказано "

Теперь настоящая проблема заключается в том, что на клиентских компьютерах моего клиента пользователи не имеют доступа к учетной записи администратора. Что мне делать?

Я проверил, и вышеупомянутая dll создана во временной папке, но программа не может получить к ней доступ. Я также дал Full Control разрешение на Everyone во вкладке безопасности окна свойств 'C:\Users\user\AppData\Local\Temp'. Но безуспешно.

Я также пытался запустить следующий код перед загрузкой отчета:

reportViewer1.LocalReport.SetBasePermissionsForSandboxAppDomain(new
System.Security.PermissionSet(System.Security.Permissions.PermissionState.Unrestricted));

И этот:

reportViewer1.LocalReport.SetBasePermissionsForSandboxAppDomain(AppDomain.CurrentDomain.PermissionSet.Copy());

Я потратил больше нескольких недель, пытаясь решить эту проблему. Это происходит как на моей машине, так и на клиентском компьютере. Любые идеи приветствуются.

EDIT: Я заметил, что Report Viewer пытается «удалить» этот файл, и это выдает ошибку. Вот трассировка стека:

Microsoft.Reporting.WinForms.LocalProcessingException: An error occurred during local 
report processing. ---> Microsoft.Reporting.DefinitionInvalidException: The definition of the report 'D:\Projects\MyProject\bin\Reports\Report1.rdl' is invalid. ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: An unexpected error occurred in Report Processing. ---> System.UnauthorizedAccessException: Access to the path 'C:\Users\User1\AppData\Local\Temp\expression_host_2bc11a902f7142e9a62bb28fd36c2d26.dll' is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.File.Delete(String path)
   at Microsoft.ReportingServices.RdlExpressions.ExprHostCompiler.InternalCompile(Report report, AppDomain compilationTempAppDomain, Boolean refusePermissions)
   at Microsoft.ReportingServices.RdlExpressions.ExprHostCompiler.<>c__DisplayClass1.<Compile>b__0()
   at Microsoft.ReportingServices.Diagnostics.RevertImpersonationContext.<>c__DisplayClass1.<Run>b__0(Object state)
   at System.Security.SecurityContext.Run(SecurityContext securityContext, ContextCallback callback, Object state)
   at Microsoft.ReportingServices.Diagnostics.RevertImpersonationContext.Run(ContextBody callback)
   at Microsoft.ReportingServices.RdlExpressions.ExprHostCompiler.Compile(Report report, AppDomain compilationTempAppDomain, Boolean refusePermissions)
   at Microsoft.ReportingServices.ReportPublishing.ReportPublishing.Phase3(ICatalogItemContext reportContext, ParameterInfoCollection& parameters, AppDomain compilationTempAppDomain, Boolean generateExpressionHostWithRefusedPermissions, Dictionary`2& groupingExprCountAtScope)
   at Microsoft.ReportingServices.ReportPublishing.ReportPublishing.CreateIntermediateFormat(ICatalogItemContext reportContext, Byte[] definition, IChunkFactory createChunkCallback, CheckSharedDataSource checkDataSourceCallback, ResolveTemporaryDataSource resolveTemporaryDataSourceCallback, DataSourceInfoCollection originalDataSources, PublishingErrorContext errorContext, AppDomain compilationTempAppDomain, Boolean generateExpressionHostWithRefusedPermissions, IDataProtection dataProtection, String& description, String& language, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks)
   at Microsoft.ReportingServices.ReportProcessing.ReportProcessing.CompileOdpReport(ICatalogItemContext reportContext, Byte[] reportDefinition, IChunkFactory createChunkCallback, CheckSharedDataSource checkDataSourceCallback, ResolveTemporaryDataSource resolveTemporaryDataSourceCallback, DataSourceInfoCollection originalDataSources, PublishingErrorContext errorContext, AppDomain compilationTempAppDomain, Boolean generateExpressionHostWithRefusedPermissions, IDataProtection dataProtection, String& reportDescription, String& reportLanguage, ParameterInfoCollection& parameters, DataSourceInfoCollection& dataSources, UserLocationFlags& userReferenceLocation, ArrayList& dataSetsName, Boolean& hasExternalImages, Boolean& hasHyperlinks)
   at Microsoft.ReportingServices.ReportProcessing.ReportProcessing.CreateIntermediateFormat(ICatalogItemContext reportContext, Byte[] reportDefinition, IChunkFactory createChunkFactory, CheckSharedDataSource checkDataSourceCallback, ResolveTemporaryDataSource resolveTemporaryDataSourceCallback, DataSourceInfoCollection originalDataSources, AppDomain compilationTempAppDomain, Boolean generateExpressionHostWithRefusedPermissions, ReportProcessingFlags processingFlags, IDataProtection dataProtection)

File.Delete() вызывается в ExprHostCompiler.InternalCompile(). Просмотр через Reflector говорит, что это происходит таким образом (посмотрите на блок кода конца внутри finally):

private byte[] InternalCompile(Report report, AppDomain compilationTempAppDomain, bool refusePermissions)
{
    if (this.m_builder.HasExpressions)
    {
        CompilerParameters options = new CompilerParameters {
            OutputAssembly = string.Format(CultureInfo.InvariantCulture, "{0}{1}.dll", new object[] { Path.GetTempPath(), report.ExprHostAssemblyName }),
            GenerateExecutable = false,
            GenerateInMemory = false,
            IncludeDebugInformation = false
        };
        options.ReferencedAssemblies.Add("System.dll");
        options.ReferencedAssemblies.Add(typeof(ReportObjectModelProxy).Assembly.Location);
        options.CompilerOptions = options.CompilerOptions + this.m_langParser.GetCompilerArguments();
        if (report.CodeModules != null)
        {
            this.ResolveAssemblylocations(report.CodeModules, options, this.m_errorContext, compilationTempAppDomain);
        }
        CompilerResults results = null;
        try
        {
            CodeCompileUnit exprHost = this.m_builder.GetExprHost(report.IntermediateFormatVersion, refusePermissions);
            report.CompiledCodeGeneratedWithRefusedPermissions = refusePermissions;
            CodeDomProvider codeCompiler = this.m_langParser.GetCodeCompiler();
            results = codeCompiler.CompileAssemblyFromDom(options, new CodeCompileUnit[] { exprHost });
            if (Global.Tracer.TraceVerbose)
            {
                try
                {
                    using (MemoryStream stream = new MemoryStream())
                    {
                        IndentedTextWriter writer = new IndentedTextWriter(new StreamWriter(stream), "    ");
                        codeCompiler.GenerateCodeFromCompileUnit(exprHost, writer, new CodeGeneratorOptions());
                        writer.Flush();
                        stream.Position = 0L;
                        Global.Tracer.Trace(new StreamReader(stream).ReadToEnd());
                    }
                }
                catch
                {
                }
            }
            if ((results.NativeCompilerReturnValue != 0) || (results.Errors.Count > 0))
            {
                this.ParseErrors(results, report.CodeClasses);
                return new byte[0];
            }
            using (FileStream stream2 = File.OpenRead(results.PathToAssembly))
            {
                byte[] buffer = new byte[stream2.Length];
                int num = stream2.Read(buffer, 0, (int) stream2.Length);
                Global.Tracer.Assert(num == stream2.Length, "(read == fs.Length)");
                return buffer;
            }
        }
        finally
        {
            if ((results != null) && (results.PathToAssembly != null))
            {
                File.Delete(results.PathToAssembly); //<------- Here!
            }
        }
    }
    return new byte[0];
}

Есть ли способ предотвратить его удаление?

7 голосов | спросил Delphi.Boy 15 MarpmSat, 15 Mar 2014 14:55:20 +04002014-03-15T14:55:20+04:0002 2014, 14:55:20

2 ответа


0

Я не могу поверить, что моя проблема наконец-то решена одним щелчком мыши! Посмотрите эту запись блога . Я отключил мой AV и вуаля!

ответил Delphi.Boy 5 AMpSat, 05 Apr 2014 11:53:10 +040053Saturday 2014, 11:53:10
0

Похоже, ты почти там, просто пропустил один кусок.

Согласно документации для LocalReport.SetBasePermissionsForSandboxAppDomain , необходимо добавить разрешение для Выполнения : "... Необходимо убедиться, что указанный набор разрешений включает разрешение на выполнение. В противном случае никакие пользовательские сборки кода не могут быть выполнены, а выражения не могут быть оценены. "

Попробуйте следующую последовательность действий:

    PermissionSet permissions = new PermissionSet(PermissionState.None);
    permissions.AddPermission(new FileIOPermission(PermissionState.Unrestricted));
    permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));  // The missing piece

    reportViewer1.LocalReport.SetBasePermissionsForSandboxAppDomain(permissions);
ответил B L 17 MarpmMon, 17 Mar 2014 23:46:42 +04002014-03-17T23:46:42+04:0011 2014, 23:46:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132