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


121

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

これどうやってするの?

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

回答:


141

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

主に、Windowsサービスを開始/停止する方法は2つあります。 1.ログオンWindowsユーザーアカウントを介してサービスに直接アクセスします。2. Network Serviceアカウントを使用して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-1000であるとします。[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ユーザー "Network Services"にアクセス許可を付与する必要があります。手順は同じで、コマンドのパラメータのみが変更されます。アクセス許可を "Network Services"に設定したので、以前に使用した最後の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を参照してください。


11
注:** 自分のマシンで実行したshshowコマンドの結果をコピーしてから、指定した内容に従って編集する必要があります。**ここからコードをコピーして、そのままコンピューターで実行しないでください。
2010

5
私はこの手動のアプローチを試しましたが、それは見事に機能しました。しかし、あなたが私のようで、20台以上のコンピューターでこれを行う必要がある場合は、これを行うためのプログラムまたはスクリプトが必要になります。Windows API呼び出しQueryServiceObjectSecurity、およびSetServiceObjectSecurityを使用できます。MSDNには、これを「ゲスト」アカウントに適用するための
Drew Chapin

1
大きな賞賛!魅力のように働いた。
Horst Gutmann

2
この回答に費やされた労力を気にしないために、他の回答のいくつかはより簡単でより直接的な解決策を提供すると思います。私はこれのいくつかの利点を逃していない限り?
Spike0xff

1
これをプログラムで実行していて、出力を分割したいsc sdshow場合は、この正規表現を使用してコンポーネントを分割(?:\D:)?\(.+?\)し、SIDが最後から2番目の新しいパーツを挿入します。
PhonicUK 2018年

115

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

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

付与できる権限は次のように定義されています(ここからリストを取得)。

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を指定することで、ジョブユーザーにw3svcサービスの一時停止/続行、開始、および停止を許可しています。


18
これが最良の答えです。レジストリをハックしたり、SIDを変換したり、あいまいなACLフォーマットに依存したりすることなく、ジョブに適したツールを使用します。ジョブを迅速かつ簡単に実行するために必要なすべての情報を、適切なシナリオに外挿するのに十分な詳細を提供します。
pierce.jason 2014

2
これを使用する場合、再起動またはログアウト/ログインする必要がありますか?
デビッドは2015

2
@DavidGrinberg影響を受けたアカウントをログオフしてから再度ログオンする必要があったことや、ここで説明するようにsubinaclのみを使用している場合は再起動する必要があったことを思い出しません。
2015年

1
sc \\server start|stop|query servicenameリモートサーバーから使用して2012サーバーでこれが動作することを確認できます。再起動/ログオフは不要
Stig Eide

これにより、ローカルでサービスを開始することができました。ただし、CouldNotAccessDependentServicesリモートPowerShell を使用するとクラッシュしましたCannot access dependent services of '...'E : Enumerate Dependent ServicesACLの権利に追加することで修正されました。
ウィレム

42
  1. 管理者としてログインします。
  2. subinacl.exeMicrosoftからダウンロード:http :
    //www.microsoft.com/en-us/download/details.aspx?id=23510
  3. BSTサービスを管理する権限を通常のユーザーアカウントに付与します。
    subinacl.exeはにありますC:\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サービスを起動できるようになります。

1
手動で構成を操作するよりもはるかに簡単で優れています。
gsk 2013年

1
ログアウトは必要ですか?
デビッドは2015

おっと!失敗しました...「OpenSCManagerのエラー:RPCサーバーが利用できません。警告:/ grant = mike = f:前のオブジェクトが開かれていません」を受け取りました。私が試したサービスはMySQLでした。再起動:いつものようにアクセスが拒否されます。
マイクげっ歯類

15

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

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

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

ServiceSecurityEditorはごまかしのように感じます、それはとても簡単です:)


1
私はこの推奨事項に基づいてServiceSecurityEditorを試しましたが、それは優れています。
グルジョシュ

11

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

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

Windows Server 2008 / Windows 7の手順が記載されたMSKB記事ですが、手順は2000と2003でも同じです。


1

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


-2

Windowsサービスは、ローカルシステムアカウントを使用して実行されます。ユーザーがシステムにログインしたときに自動的に開始することも、手動で開始することもできますが、Windowsサービスは、マシン上の特定のユーザーアカウントを使用してBSTを実行できることを通知します。次のように:services.mscを開始し、WindowsサービスのプロパティBSTに移動します。そこから、必要なuser.Serviceのログインパラメータを指定すると、そのユーザーアカウントで実行され、他のユーザーはそのサービスを実行できなくなります。


1
ジャックへの対応ありがとうございます。しかし、それは私がやりたいことではありません。現在のように実行するには、サービスBSTが必要です。停止/開始できるのは、管理者以外のユーザーのみです。
2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.