4

私は他の3つのサーバーアプリのステータスを監視するサービスモニターアプリを持っています-あなたはそれらの種類の緑、赤のステータスのもの、開始、停止などを知っています。

問題は、ユーザーが管理者であっても、Windows7で間違った状態を表示することです。

開始、停止ボタンが無効になり、インストールボタンが有効になり、ステータスの色が灰色になりますが、これも間違っています。スタートボタンを有効にして、サービスステータスが緑色で表示されている必要があります-アプリは実行中です。

アプリケーションを「管理者として実行」の設定で実行すると、正常に動作します。

このアプリケーションはDelphi7で記述されており、他のバージョンのWindowsでも完全に機能します。このコード行:

OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_ALL_ACCESS);

Win7では常に0を返すため、問題が発生します。

「管理者として実行」以外のアイデアと、可能であれば回避策。

4

1 に答える 1

8

制限付きアクセスが要求された場合、管理者権限を必要とせずにサービスマネージャーを開くことができます。このコード行:

ManagerHandle := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE,
  SC_MANAGER_ENUMERATE_SERVICE);

限られたユーザーアカウントから使用されている場合でも、サービスマネージャーでアクティブなサービスのデータベースを開きます。返されたハンドルを使用しEnumServicesStatusEx()て、実行中のサービスに関する情報を取得するために呼び出すことができます。

SC_MANAGER_ALL_ACCESSパラメータとして渡すことは、dwDesiredAccessを渡すことを意味SC_MANAGER_CREATE_SERVICEし、ドキュメントには次のように記載されています。

管理者権限を持つプロセスのみが、CreateService関数で使用できるデータベースハンドルを開くことができます。

したがって、プログラムを標準ユーザーが実行できるアクションに制限する場合、コードはWindows 7で変更せずに実行する必要があります。それ以外はすべて、インストーラーまたは昇格して実行される特別なプログラムのいずれかで実行する必要があります。

これは、Windows7の新しい要件ではありません。

このアプリケーションはDelphi7で記述されており、他のバージョンのWindowsでも完全に機能します。

は、以前のバージョンのOSの限られたアカウントでアプリケーションを適切にテストしたことがないことのみを示しています。Windows NTではすでに(ほぼ20年前)、制限されたユーザーがフルアクセス権でサービスマネージャーを開くことが許可されていなかったため、コードは同じように失敗しました。

于 2010-04-06T06:39:31.930 に答える