使用Interop将Word转换为PDF需要管理员权限

时间:2014-09-02 14:11:24

标签: c# asp.net pdf admin office-interop

首先,我知道这属于“不推荐的做法”类别,但我要求通过ASP.Net站点将Word文档转换为PDF,并且我一直在使用Word Interop作为它是免费的,易于实现,并且Word已经安装在服务器上。

当我进行测试时,它对我有用,但在发布用户后报告“未经授权的访问”错误。我有服务器的管理员权限,我发现在服务器上添加用户作为管理员工作,但我不想为每个用户授予管理员权限。

因此,有很多事情需要发生,是否有一个替代的免费库,用于将Word文档转换为PDF,我可以使用它?是否有一种简单的方法可以让我的用户访问Interop库而无需授予管理员权限?有没有办法模拟管理员用户的这部分Web应用程序,因为应用程序需要Windows身份验证?

还有什么我没有想到的可能对我有益吗?

1 个答案:

答案 0 :(得分:2)

您可以使用模拟以不同的用户身份运行代码。 CodeProject上有一个很好的模拟类,http://www.codeproject.com/Articles/10090/A-small-C-Class-for-impersonating-a-User

只需在计算机上创建一个新的管理员帐户,可以访问您想要的内容,将凭据存储在应用程序设置中的web.config中(如果您想使用rijandael加密它们并使用代码解密它们等等< / p>

但是长期存储很短,你可以这样使用它,

using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) )
{
    //This code is running elevated as the specified user
}
//This code is reverted back to the previous user.

我实际上编写了自己的web.config ConfigurationElement来存储凭据。它看起来像这样,

public class CredentialConfigurationElement : ConfigurationElement
{
    #region Properties
    [ConfigurationProperty("userName", DefaultValue="", IsRequired=true)]
    public string UserName
    {
        get { return (string)this["userName"];}
        set { this["userName"] = value; }
    }

    [ConfigurationProperty("password", DefaultValue = "", IsRequired = true)]
    public string Password
    {
        get { return (string)this["password"]; }
        set { this["password"] = value; }
    }
    #endregion

    #region Explicit Operators
    public static implicit operator NetworkCredential(CredentialConfigurationElement value)
    {
        return new NetworkCredential(value.UserName, value.Password);
    }
    public static implicit operator CredentialConfigurationElement(NetworkCredential value)
    {
        return new CredentialConfigurationElement() { UserName = value.UserName, Password = value.Password };
    }
    #endregion
}

但是,要使用它,您需要创建一个Custom ConfigurationSection,一个继承自ConfigurationSection的类,并将CredentialConfigurationElement公开为属性。

E.g。你可以创建一个名为CodeImpersonatorSection的新部分:ConfigurationSection

在那里将CredentialConfigurationElement公开为名为ImpersonationCredentials的属性。

然后使用(CodeImpersonatorSection)WebConfigurationManager.GetSection(&#34; / yoursectionnamehere&#34;);获取配置实例。

(可选)修改Impersonator类以自动执行此操作,并将其更改为具有静态方法(如

Impersonator.RunUnderImpersonation(p => {
  //This code is impersonating the configured user.
});