4

ストレージ以外の SCSI デバイスと通信するための Windows ソフトウェアを更新する際のセキュリティ上の問題について、助けが必要です。

オリジナルのソフトウェアは Windows XP 用に DLL として書かれており、Adaptec の ASPI API を介してデバイスと通信していました。ASPI には実際にはセキュリティがありませんでした。そのため、任意のユーザーが実行する任意のアプリケーションが、私の DLL を使用してこれらのデバイスの 1 つと通信することができ、すべてがうまく機能しました。

現在、Microsoft の最新の SPTI (SCSI パススルー インターフェイス) API を使用して Windows 7 で動作するようにソフトウェアを更新しています。XP で SPTI を使用すると問題なく動作しますが、Windows 7 のセキュリティははるかに厳しく、通常のユーザーまたは管理者でさえ、SPTI 呼び出しは権限が不十分であることを示すエラーを返します。非表示の「管理者」アカウントを使用してログインすると、ソフトウェアは SPTI で正常に動作しますが、これは受け入れられる展開オプションではありません。

これまでに調べたいくつかの代替案を、既存のコードを書き直さなければならないレベルの低い順に示します。

  • スレッドをスピンオフし、その特権をエスカレートして「管理者」のふりをして、SPTI と通信できるようにします。[LogonUser()/ImpersonateLoggedOnUser()/LoadUserProfile(); を使用してこれを機能させることができませんでした。LoadUserProfile() の呼び出しが失敗し、SPTI 呼び出しも同様に権限不足エラーで失敗します。]
  • SPTI と通信するための適切なアクセス許可を持つ Windows サービスを作成し、DLL がそのサービスと通信するようにします。
  • ユーザー空間 (UMDF) ドライバー。書き直しには費用がかかりますし、UMDF が SCSI デバイスへのアクセスをサポートしているかどうかもわかりません。
  • カーネル (KMDF) ドライバー。動作するはずですが、より長く、より高価な書き直しになります。

ここのコミュニティが知恵/経験/アイデアを提供して、私のコードが Windows 7 でこの SCSI デバイスと通信できるようになることを願っています。

4

1 に答える 1

3

コメントするには長すぎるので、私はこれを答えとして差し出します。

アプリケーションのマニフェストを、実行時に昇格が必要になるように設定しようとしたと思いますか?プロセスを昇格させる必要があることに注意することが重要です。AFAIKではスレッドを昇格させることはできません。

それをサービスとして実行し、それと通信するというあなたの提案(名前付きパイプまたはWCFは実行可能なオプションです)は良いものです。ローカルシステムとして実行すると、サービスはローカル管理者よりも特権が高くなります。

于 2012-09-08T04:57:39.730 に答える