【问题标题】:Restrict access to audio device under Windows XP-8 to specific application/user限制特定应用程序/用户在 Windows XP-8 下对音频设备的访问
【发布时间】:2013-05-08 06:09:23
【问题描述】:

我编写了一个 c# 4.0 应用程序,它分析麦克风输入并记录代表客户输入的信用卡号码的 DTMF 音调。这一切都很好,但由于我们在 PCI 合规性 下工作(请参阅 www.pcisecuritystandards.org),我们不希望允许登录用户(呼叫中心工作人员)收听甚至录制麦克风输入,以便他们可以使用第三方应用程序或手机自行解析信用卡号。所以我的问题是:

  • 我如何限制麦克风输入特定的应用程序所以 不能在其他地方听到或录制?

如果没有解决办法,就会出现第二个问题:

  • 我如何限制 麦克风输入特定用户 以便它 无法在其他地方听到或录制(我可以运行该软件 作为特定用户凭据下的 Windows 服务)?

亲切的问候, JB

【问题讨论】:

  • 如果可能的话,这将是一个安全策略问题,为此我建议你最好不要使用 serverfault ...
  • 受过培训的用户只需听音即可解码 DTMF。你有一个更大的问题,你需要完全切断信号。这需要与 PBX 设备连接。标准化很差,与 PBX 供应商合作以取得成功。

标签: c# windows security driver wdf


【解决方案1】:

限制访问设备的主要方法是在设备上设置安全描述符。因此,授予特定用户组的权限是您应该采取的方式。

Windows XP 的确切实现可能与更高版本的 Windows 不同。 Windows 8 也有新的可能性。 Audio Mixer APIs 可以在 Windows XP 中使用。从 Vista 开始Windows Multimedia Device (MMDevice) API 可以使用。 MMDevice API 对the property store 的实现。您可以使用IPropertyStore::SetValueIPropertyStore::Commit 来更改属性。 Unified Device Property 模型是从 Windows Vista 开始引入的。有不同的 Windows API 在内部使用 SetupAPI 来访问设备并设置其属性(请参阅here)。我认为您应该将PKEY_Device_SecuritySDS 属性设置为安全设备。可以使用 SetupDiSetDeviceRegistryPropertySetupDiSetClassRegistryProperty 等旧 API 在 Windows XP 上设置属性(请参阅 here)。

如果我在我的计算机 devmgmt.msc 上启动并检查麦克风设备的默认属性,那么我可以看到安全描述符

您需要更改它,以便只有特定的用户组(或用户)才能访问它。

PKEY_Device_SecuritySDSPKEY_Device_Security 属性可以通过SetupDiSetDevicePropertySPDRP_SECURITY_SDSSPDRP_SECURITY 更改(请参阅here)。 SDS 参数(PKEY_Device_SecuritySDSSPDRP_SECURITY_SDS)的使用可能更容易,因为使用可读的Security Descriptor Definition Language (SDDL)

更改设备上的安全描述符后,您需要使用SetupDiSetClassInstallParamsSetupDiCallClassInstaller 以及DIF_PROPERTYCHANGEDICS_PROPCHANGE 来重置设备。您可以在 WinDDK 上的 devcon 实用程序的源代码中找到代码示例。或者,您可以使用 CM_Disable_DevNodeCM_Enable_DevNode 使用新属性重新启动它。

【讨论】:

  • 听起来不错,我会在星期一研究一下(新西兰已经是午餐时间了...)。
  • @JamesBlond:我想知道你是否使用这种方法?
  • @WouterHuysentruit:我在这里简要描述了我在为我的一位客户开发的应用程序中使用的东西,以保护Windows Portable Devices (WPD) 和可移动媒体。为了枚举设备,我使用了接近 the answerthe answer 的代码。您知道我不能发布为客户开发的代码,但我希望同样的想法也适用于音频设备。
  • @JamesBlond:感谢您的更新。我可能在未来的项目中也必须这样做,这就是我问的原因。
  • @WouterHuysentruit 不幸的是,我还没有时间测试它。我对其他项目有点偏心,这必须等待几周:-(
【解决方案2】:

您应该可以使用 Core Audio API 来实现。对于系统中的每个播放设备和采集设备,您可以控制该设备是否可以在独占模式下使用。

一个缺点 - Windows XP 下不支持 Core Audio API。

【讨论】:

  • 为这个想法喝彩。不幸的是,我必须能够在 Windows XP 上使用它(即使支持在不到一年的时间内用完)。不过谢谢你的建议!
【解决方案3】:

我认为你的问题的解决方案是写一个KS Filter

创建一个内核流过滤器,该过滤器能够根据您的应用程序的需要解码 DTMF,并将解码后的数据发送到您的应用程序。当过滤器处于 DTMF 解码模式时,它只是将静音输出到过滤器堆栈的其余部分。

如果使用 USB 音频设备,您也可以改为编写 GFX Filter,它可以基于每个用户进行配置。但这似乎只适用于 32 位操作系统。 WinDDK 有一个名为gfxswap.xp 的示例。

【讨论】:

  • 再次感谢您的想法。如果 Olegs 的建议无法按计划进行,我们将进一步调查。
【解决方案4】:

您可以在应用程序中使用 ASIO 音频驱动程序。

ASIO 是 Steinberg 开发的一种技术,用于提供低延迟音频输入和输出,作为副作用,要求使用 ASIO 驱动程序的设备将设备使用完全限制在需要它的进程中,此外还有多个其他优点这可能与您的需求无关。

感谢ASIO4ALL 项目,它适用于所有声卡,因此只要您在应用程序中提供它,兼容性就不会成为问题

有关更多信息,请查看有关 ASIO here 的维基百科文章,或获取 SDK here(您需要注册 Steinberg 开发者帐户才能继续)

【讨论】:

  • 到目前为止听起来很有趣。我已经对其进行了调查,并将对其进行进一步调查,以防我无法根据 Oleg 的建议将其锁定。干杯!
【解决方案5】:

如果您可以控制(静音)声音设备的音量并在完成后将其设置回原来的状态,这会有所帮助吗?您可以查看this link 的想法。祝你好运。

【讨论】:

  • 据我了解您的建议并非如此。我将不得不从音频设备获取输入,即使我将输出静音,用户仍然可以在机器上使用录音机软件(即使它已被锁定)。但是感谢您的链接。
猜你喜欢
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多