以下に、誰かが知る必要がある場合に、管理者以外のユーザーアカウントから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を参照してください。