web-dev-qa-db-ja.com

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

たとえば、BSTという名前のWindowsServiceがあります。また、管理者以外のユーザーUserAに、この特定のサービスを開始/停止する権限を与える必要があります。私のサービスは、Windows Server 2003からWindows 7まで、さまざまなWindows OSで実行されます。

これどうやってするの?

私はグーグルで検索し、[sc sdset]コマンドを使用して許可を与えることについていくつか発見しましたが、パラメーターについては正確にはわかりません。グループの権限を設定するのではなく、特定のユーザー(この場合はUserA)のみに設定します。

119
Sach

以下、誰かが知る必要がある場合、非管理者ユーザーアカウントからWindowsサービスの開始/停止について学んだすべてをまとめました。

主に、Windowsサービスを開始/停止する方法は2つあります。 1。ログオンWindowsユーザーアカウントを介してサービスに直接アクセスします。2.ネットワークサービスアカウントを使用してIISを介してサービスにアクセスします。

サービスを開始/停止するコマンドラインコマンド:

C:/> net start <SERVICE_NAME>
C:/> net stop <SERVICE_NAME>

サービスを開始/停止するC#コード:

ServiceController service = new ServiceController(SERVICE_NAME);

//Start the service
if (service.Status == ServiceControllerStatus.Stopped)
{
      service.Start();
      service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(10.0));
}

//Stop the service
if (service.Status == ServiceControllerStatus.Running)
{
      service.Stop();
      service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10.0));
}

注1: IISを介してサービスにアクセスする場合、Visual Studio C#ASP.NET Webアプリケーションを作成し、そこにコードを配置します。 WebServiceをIISルートフォルダー(C:\ inetpub\wwwroot \)に展開すれば、準備完了です。 URL http:///でアクセスします。

1。直接アクセス方法

コマンドを入力するかコードを実行するWindowsユーザーアカウントが管理者以外のアカウントである場合、Windowsサービスを開始および停止できるように、その特定のユーザーアカウントに特権を設定する必要があります。これがあなたのやり方です。 サービスを開始/停止する非管理者アカウントを持つコンピューターの管理者アカウントにログインします。コマンドプロンプトを開き、次のコマンドを入力します。

C:/>sc sdshow <SERVICE_NAME>

この出力は次のようになります。

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

このコンピュータ上の各ユーザー/グループが持つすべての権限が一覧表示されます。

A description of one part of above command is as follows:

    D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)

It has the default owner, default group, and it has the Security descriptor control flags (A;;CCLCSWRPWPDTLOCRRC;;;SY):

ace_type - "A": ACCESS_ALLOWED_ACE_TYPE,
ace_flags - n/a,
rights - CCLCSWRPWPDTLOCRRC,  please refer to the Access Rights and Access Masks and Directory Services Access Rights
CC: ADS_RIGHT_DS_CREATE_CHILD - Create a child DS object.
LC: ADS_RIGHT_ACTRL_DS_LIST - Enumerate a DS object.
SW: ADS_RIGHT_DS_SELF - Access allowed only after validated rights checks supported by the object are performed. This flag can be used alone to perform all validated rights checks of the object or it can be combined with an identifier of a specific validated right to perform only that check.
RP: ADS_RIGHT_DS_READ_PROP - Read the properties of a DS object.
WP: ADS_RIGHT_DS_WRITE_PROP - Write properties for a DS object.
DT: ADS_RIGHT_DS_DELETE_TREE - Delete a tree of DS objects.
LO: ADS_RIGHT_DS_LIST_OBJECT - List a tree of DS objects.
CR: ADS_RIGHT_DS_CONTROL_ACCESS - Access allowed only after extended rights checks supported by the object are performed. This flag can be used alone to perform all extended rights checks on the object or it can be combined with an identifier of a specific extended right to perform only that check.
RC: READ_CONTROL - The right to read the information in the object's security descriptor, not including the information in the system access control list (SACL). (This is a Standard Access Right, please read more http://msdn.Microsoft.com/en-us/library/aa379607(VS.85).aspx)
object_guid - n/a,
inherit_object_guid - n/a,
account_sid - "SY": Local system. The corresponding RID is SECURITY_LOCAL_SYSTEM_RID.

ここで必要なのは、必要なグループまたはユーザーにWindowsサービスを開始/停止する適切なアクセス許可を設定することです。この場合、現在の非管理者ユーザーがサービスを開始/停止できる必要があるため、そのユーザーにアクセス許可を設定します。そのためには、その特定のWindowsユーザーアカウントのSIDが必要です。取得するには、レジストリを開き([スタート]> [regedit])、次のレジストリキーを見つけます。

LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

その下には、このコンピューターの各ユーザーアカウントごとに個別のキーがあり、キー名は各アカウントのSIDです。 SIDは通常、S-1-5-21-2103278432-2794320136-1883075150-1000という形式です。各キーをクリックすると、右側のペインに各キーの値のリストが表示されます。 「ProfileImagePath」を見つけ、その値によって、SIDが属するユーザー名を見つけることができます。たとえば、アカウントのユーザー名がSACHの場合、「ProfileImagePath」の値は「C:\ Users\Sach」のようになります。そのため、アクセス許可を設定するユーザーアカウントのSIDを書き留めます。

注2:ここでは、前述のキーとその値のリストを取得するために使用できる簡単なC#コードサンプルを示します。

//LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList RegistryKey
RegistryKey profileList = Registry.LocalMachine.OpenSubKey(keyName);

//Get a list of SID corresponding to each account on the computer
string[] sidList = profileList.GetSubKeyNames();

foreach (string sid in sidList)
{
    //Based on above names, get 'Registry Keys' corresponding to each SID
    RegistryKey profile = Registry.LocalMachine.OpenSubKey(Path.Combine(keyName, sid));

    //SID
    string strSID = sid;
    //UserName which is represented by above SID    
    string strUserName = (string)profile.GetValue("ProfileImagePath");
}

これで、アクセス許可を設定するユーザーアカウントのSIDが得られたので、次に進みましょう。ユーザーアカウントのSIDがS-1-5-21-2103278432-2794320136-1883075150-10であると仮定します。 [sc sdshow]コマンドの出力をテキストエディターにコピーします。次のようになります。

D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)

次に、(A ;; CCLCSWRPWPDTLOCRRC ;;; SY)上記のテキストの一部をコピーし、直前に貼り付けます S:(AU; ...テキストの一部。次に、その部分を次のように変更します。(A ;; RPWPCR ;;; S-1-5-21- 2103278432-2794320136-1883075150-1000)

次に、先頭にsc sdsetを追加し、上記の部分を引用符で囲みます。最終的なコマンドは次のようになります。

sc sdset <SERVICE_NAME> "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;S-1-5-21-2103278432-2794320136-1883075150-1000)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"

コマンドプロンプトでこれを実行すると、成功した場合、次のように出力が表示されます。

[SC] SetServiceObjectSecurity SUCCESS

これで準備完了です!管理者以外のユーザーアカウントには、サービスを開始/停止する権限が付与されています!ユーザーアカウントにログインして、サービスを開始/停止してみてください。

2。IISメソッドを介したアクセス

この場合、ログオンWindowsユーザーアカウントではなく、IISユーザー「ネットワークサービス」にアクセス許可を付与する必要があります。手順は同じで、コマンドのパラメーターのみが変更されます。許可を「ネットワークサービス」に設定したので、前に使用した最後のsdsetコマンドでSIDを文字列「NS」に置き換えます。最終的なコマンドは次のようになります。

sc sdset <SERVICE_NAME> "D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;RPWPCR;;;NS)S:(AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)"

管理者ユーザーアカウントからのコマンドプロンプトで実行します。 WebMethodを使用して、管理者アカウントであるかどうかに関係なく、任意のユーザーアカウントからサービスを開始/停止する権限があります。その方法については、注1を参照してください。

137
Sach

これには SubInACL ユーティリティを使用します。たとえば、コンピュータVMX001のユーザーjobにWorld Wide Web Publishingを開始および停止する機能を与えたい場合サービス(w3svcとも呼ばれます)、管理者として次のコマンドを発行します。

subinacl.exe /service w3svc /grant=VMX001\job=PTO

付与できる権限は、次のように定義されています( here から取得したリスト):

F : Full Control
R : Generic Read
W : Generic Write
X : Generic eXecute
L : Read controL
Q : Query Service Configuration
S : Query Service Status
E : Enumerate Dependent Services
C : Service Change Configuration
T : Start Service
O : Stop Service
P : Pause/Continue Service
I : Interrogate Service 
U : Service User-Defined Control Commands

したがって、PTOを指定することにより、jobユーザーにw3svcサービスの一時停止/継続、開始、および停止を許可します。

109
arcain
  1. 管理者としてログインします。
  2. Microsoftからsubinacl.exeをダウンロードします。
    http://www.Microsoft.com/en-us/download/details.aspx?id=2351
  3. 通常のユーザーアカウントにアクセス許可を付与して、BSTサービスを管理します。
    subinacl.exeC:\Program Files (x86)\Windows Resource Kits\Tools\にあります)。
  4. cd C:\Program Files (x86)\Windows Resource Kits\Tools\
    subinacl /SERVICE \\MachineName\bst /GRANT=domainname.com\username=Fまたは
    subinacl /SERVICE \\MachineName\bst /GRANT=username=F
  5. ログアウトし、ユーザーとして再度ログインします。これで、BSTサービスを起動できるようになります。
40
Venkat

無料のGUIツールがあります ServiceSecurityEditor

これにより、Windowsサービスのアクセス許可を編集できます。これを使用して、管理者以外のユーザーにサービスを開始および停止する権限を付与しました。

このツールについて知る前に、「sc sdset」を使用していました。

ServiceSecurityEditorは不正行為のように感じますが、とても簡単です:)

13
FCW

次のいずれかのツールを使用して、サービスに管理権限を付与するのが非常に簡単です。

  • グループポリシー
  • セキュリティテンプレート
  • subinacl.exeコマンドラインツール。

MSKB記事 は、Windows Server 2008/Windows 7の手順を示していますが、手順は2000と2003で同じです。

11
Ryan Fisher

subinacl.exeコマンドラインツールは、おそらくこの投稿に含まれる唯一の実行可能な非常に使いやすいツールです。非システムサービスでGPOを使用することはできません。他のオプションは、あまりにも複雑すぎる方法です。

1
JustAGuy