【问题标题】:No voice installed on the system or none available with the current security setting系统上未安装语音或当前安全设置不可用
【发布时间】:2011-08-11 05:27:02
【问题描述】:

尝试使用 SpeechSynthesizer 在 c# 上创建 .wav 文件时出现 IIS 服务器异常。

【问题讨论】:

    标签: iis speechsynthesizer


    【解决方案1】:

    当应用程序无法访问语音以供 SpeechSynthesizer 使用时,会导致此错误。第一个可能的原因是系统上没有任何已安装的声音。很可能这不是问题,但您仍应通过运行以下代码进行仔细检查:

    SpeechSynthesizer ssTest = new SpeechSynthesizer();
    System.Diagnostics.Debug.WriteLine(ssTest.GetInstalledVoices().Count);
    

    假设以上返回的数字大于 0,则问题可能是您的应用程序的安全设置问题更为复杂。

    SpeechSynthesizer 类中的多个方法(包括 SetOutputToWaveFile)要求直接调用者完全受信任。对于桌面应用程序(SpeechSynthesizer 类可能是为其设计的),这可能不是一个大问题,但在 Web 环境中具有更严重的安全影响。因此,IIS 的默认设置只使应用程序部分受信任。有很多方法可以改变这一点,可能最快也是最肮脏的方法是 switching the application pool's 身份从默认帐户更改为具有管理员权限的帐户,如 LocalSystem 帐户。

    再次强调,这将严重损害您的应用程序的安全性,应在实施前进行充分研究。

    【讨论】:

    • 将应用程序池切换到 LocalSystem,没有骰子。这不是用户权限问题,它似乎与执行上下文的信任有关。执行您上面粘贴的代码的控制台应用程序从网络驱动器错误(我的用户,部分信任执行)运行,但在本地运行正常(我的用户,完全信任执行)。这不是用户问题,而是执行上下文的信任问题。虽然不确定如何为开发 Web 服务器或 IIS 更改它...
    • @JimmyHoffa 控制台应用程序的安全模型处理方式略有不同,因此它不是一个完美的测试用例。您可以找到控制台应用程序here 的类似问题。如果您仍然有 Web 应用程序的问题,您可以尝试通过 web.config 等另一种方式授予完全信任,如 here 所示。
    • 更改应用程序池以使用 LocalSystem 身份对我有用。我还没有完全研究过它的安全后果,所以我不确定这是否是我的最终解决方案,但现在我很高兴它正在工作。
    【解决方案2】:

    简单修复:为运行应用程序池的同一用户授予对 C:\windows\system32\config\systemprofile\appdata\roaming 的读/写访问权限。

    【讨论】:

    • 这对我有用..但是有任何负面的安全影响吗?
    【解决方案3】:

    简单地说,以“管理员”身份运行应用程序。 ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 2012-11-21
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      相关资源
      最近更新 更多