3

ボタンで開始および停止できるようにする必要があるサービスがあります。別のプログラムでServiceControllerを使用していますが、この別のプログラムを管理者として実行すると、すべてが意図したとおりに機能します。ただし、誰でもこのサービスを制御できる必要があります。誰もがサービスを完全に制御できるように、サービスのアクセス許可を設定するにはどうすればよいですか? これは、サービスまたはインストールの一部としてプログラムで行う必要があります。vb.net で書かれた localservice です。

4

2 に答える 2

3

いくつかのオプションがあります。

1)アプリケーションを管理者として実行するように要求できます。アプリケーションが起動するたびに、UAC(Windows 7およびVistaの場合)が表示され、アプリケーションは必要なレベルに昇格されます。

管理者として.NETアプリケーションを実行します

2)サービスを停止および開始するためのアクションが必要な場合、アプリケーションは昇格を要求できます。これは、別のアプリケーションをより高いレベルで開始することによって実行され、この他のアプリケーションが実際の開始と停止を実行します。

必要な場合にのみ特権を昇格させる方法は?

3)推奨オプション、IMHO-常に実行するようにサービスを構築する必要がありますが、TCP / IP、名前付きパイプ、またはその他の通信メカニズムを介して要求をリッスンする以外は何もしないでください。その後、サービスは実際の作業を実行するスレッドを開始または停止できます。

4)サービス権を変更することができます。これに関するいくつかの情報を提供するいくつかの投稿があります(私はまだオプション3を好みます):

管理者以外のユーザーアカウントからのWindowsサービスの開始/停止

http://msmvps.com/blogs/erikr/archive/2007/09/26/set-permissions-on-a-specific-service-windows.aspx

http://fstaal01.home.xs4all.nl/swsc-us.html

アップデート

ハリーのコメントに基づいて、テキストを変更し、オプション4を追加しました。権限を微調整する方法があるようです。これらには最初は管理者権限が必要ですが、swsc(3番目のリンク)などをインストールにバンドルする場合は、それを使用して権限を設定できます。これを行うためのライセンスへの影響があるかどうかはわかりません。または、彼が貼り付けたコードのバリエーションを使用することもできます。

于 2012-07-24T19:22:49.457 に答える
2

私が持っているコードは C ですが、VB に適応するのはそれほど難しくないはずです。または、DLL に入れることもできます。または、コマンド シェルを起動してコマンドを使用することもできますsc sdset

wchar_t sddl[] = L"D:"
  L"(A;;CCLCSWRPWPDTLOCRRC;;;SY)"           
      // default permissions for local system
  L"(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)"   
      // default permissions for administrators
  L"(A;;CCLCSWLOCRRC;;;AU)"                 
      // default permissions for authenticated users
  L"(A;;CCLCSWRPWPDTLOCRRC;;;PU)"           
      // default permissions for power users
  L"(A;;RP;;;IU)"                           
      // added permission: start service for interactive users
  ;

DWORD InstallService() 
{
  SC_HANDLE manager, service;
  PSECURITY_DESCRIPTOR sd;
  DWORD err;

  wchar_t apppath[MAX_PATH + 2];

  // Note: because this is only called from main() which exits
  // immediately afterwards, no attempt is made to close the
  // handles generated.

  if (!ConvertStringSecurityDescriptorToSecurityDescriptor(sddl, 
      SDDL_REVISION_1, &sd, NULL))
  {
    err = GetLastError();
    printf("Error %u creating security descriptor.\n", err);
    return err;
  }

  if (!GetModuleFileName(0, apppath, MAX_PATH + 1)) 
  {
    err = GetLastError();
    printf("Error %u fetching module name.\n", err);
    return err;
  }

  if (_wcsicmp(apppath + wcslen(apppath) - wcslen(exename), exename) != 0) 
  {
    printf("Application name mismatch: %ls\n", 
      apppath + wcslen(apppath) - wcslen(exename));
    return ERROR_INVALID_FUNCTION;
  }

  manager = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);

  if (!manager) 
  {
    err = GetLastError();
    printf("Error %u connecting to service manager.\n", err);
    return err;
  }

  service = CreateService(manager,
    servicename,
    displayname,
    WRITE_DAC,
    SERVICE_WIN32_OWN_PROCESS,
    SERVICE_DEMAND_START,
    SERVICE_ERROR_NORMAL,
    apppath,
    0,
    0,
    NULL,
    NULL,
    NULL);

  if (!service) 
  {
    err = GetLastError();
    printf("Error %u installing service.\n", err);
    return err;
  }

  if (!SetServiceObjectSecurity(service, DACL_SECURITY_INFORMATION, sd))
  {
    err = GetLastError();
    printf("Error %u setting service security.\n", err);
    return err;
  }

  printf("Service successfully installed.\n");
  return 0;
}
于 2012-07-24T22:33:26.270 に答える