비 관리자 사용자 계정에서 Windows 서비스 시작 / 중지


121

BST라는 WindowsService가 있습니다. 관리자가 아닌 사용자 인 UserA에게이 특정 서비스를 시작 / 중지 할 수있는 권한을 부여해야합니다. 내 서비스는 Windows Server 2003에서 Windows 7까지 다양한 Windows OS에서 실행됩니다.

어떻게 할 수 있습니까?

Google을 검색하고 [sc sdset] 명령을 사용하여 권한을 부여하는 방법을 찾았지만 매개 변수에 대해 정확히 모르겠습니다. 그룹에 대한 권한을 설정하지 않고 특정 사용자 (이 경우 UserA)에게만 설정하고 싶습니다.

답변:


141

아래에서는 관리자가 아닌 사용자 계정에서 Windows 서비스를 시작 / 중지하는 방법에 대해 배운 모든 내용을 모았습니다.

주로 Windows 서비스를 시작 / 중지하는 두 가지 방법이 있습니다. 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 웹 응용 프로그램을 만들고 여기에 코드를 넣으십시오. 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 사용자 "네트워크 서비스"에게 권한을 부여해야합니다. 절차는 동일하며 명령의 매개 변수 만 변경됩니다. 권한을 "네트워크 서비스"로 설정 했으므로 이전에 사용한 마지막 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 명령 의 결과를 복사 한 다음 내가 지정한 내용에 따라 편집해야합니다. ** 여기에서 코드를 복사하여 컴퓨터에서있는 그대로 실행 하지 마십시오 .
사치

5
이 수동 접근 방식을 시도했고 훌륭하게 작동했습니다. 하지만 당신이 저와 같고 20 대 이상의 컴퓨터에서이 작업을 수행해야한다면 프로그램이나 스크립트가 필요합니다. Windows API 호출 QueryServiceObjectSecuritySetServiceObjectSecurity를 사용할 수 있습니다 . MSDN에는 이것을 "Guest"계정에 적용
Drew Chapin 2011

1
큰 명성! 매력처럼 작동했습니다.
Horst Gutmann

2
이 답변에 들어간 노력과 관심에서 벗어나지 않기 위해 다른 답변 중 일부는 더 간단하고 직접적인 솔루션을 제공한다고 생각합니다. 이것의 장점을 놓치고 있지 않는 한?
Spike0xff

1
이 작업을 프로그래밍 방식으로 수행하고 출력을 분할하려는 sc sdshow경우이 정규식을 사용하여 구성 요소를 분할 (?:\D:)?\(.+?\)한 다음 SID가있는 새 부분을 마지막에서 두 번째로 삽입 할 수 있습니다 .
PhonicUK

115

이를 위해 SubInACL 유틸리티를 사용합니다 . 예를 들어 VMX001 컴퓨터 의 사용자 작업 에 World Wide Web 게시 서비스 (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

2
이것을 사용할 때 다시 시작하거나 로그 아웃 / 로그인해야합니까?
다윗은 분석 재개 모니카 말한다

2
@DavidGrinberg 영향을받은 계정을 로그 오프 한 다음 다시 켜야하거나 여기에 설명 된대로 subinacl 만 사용할 때 다시 시작해야하는 기억이 없습니다.
arcain

1
sc \\server start|stop|query servicename원격 서버에서 사용하는 2012 서버 에서 작동하는지 확인할 수 있습니다. 다시 시작하지 \ 로그 오프 필요
의 Stig EIDE

이것은 로컬에서 서비스를 시작하는 데 효과적이었습니다. 그러나 CouldNotAccessDependentServices원격 powershell : Cannot access dependent services of '...'. E : Enumerate Dependent ServicesACL 권한에 추가하면 수정되었습니다.
Willem

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

1
로그 아웃이 필요합니까?
다윗은 분석 재개 모니카 말한다

웁스! 실패 ... "오류 OpenSCManager : RPC 서버를 사용할 수 없습니다. 경고 : / grant = mike = f : 이전 개체가 열리지 않음"이 표시됩니다. 내가 시도한 서비스는 MySQL이었습니다. 재부팅 : 액세스가 거부되었습니다.
마이크는 설치류

15

무료 GUI 도구 ServiceSecurityEditor가 있습니다.

Windows 서비스 권한을 편집 할 수 있습니다. 비 관리자 사용자에게 서비스를 시작하고 중지 할 수있는 권한을 부여하는 데 성공적으로 사용했습니다.

이 도구에 대해 알기 전에 "sc sdset"을 사용했습니다.

ServiceSecurityEditor는 속임수처럼 느껴집니다.


1
이 권장 사항에 따라 ServiceSecurityEditor를 사용해 보았고 훌륭합니다.
Guru Josh

11

다음 도구 중 하나를 사용하여 서비스에 관리 권한을 부여하는 것이 훨씬 쉽습니다.

  • 그룹 정책
  • 보안 템플릿
  • subinacl.exe 명령 줄 도구.

다음 은 Windows Server 2008 / Windows 7에 대한 지침 이 포함 된 MSKB 문서 이지만 지침은 2000과 2003에 대해 동일합니다.


1

subinacl.exe 명령 줄 도구는 아마도이 게시물의 모든 것에서 유일하게 실행 가능하고 사용하기 쉽습니다. 비 시스템 서비스와 함께 GPO를 사용할 수 없으며 다른 옵션은 너무 복잡합니다.


-2

Windows 서비스는 로컬 시스템 계정을 사용하여 실행됩니다. 사용자가 시스템에 로그인하면 자동으로 시작되거나 수동으로 시작할 수 있지만 Windows 서비스에서는 컴퓨터의 특정 사용자 계정을 사용하여 BST를 실행할 수 있습니다. 다음과 같이 services.msc를 시작하고 Windows 서비스 BST의 속성으로 이동하십시오. 여기에서 필요한 사용자의 로그인 매개 변수를 제공 할 수 있습니다. 그런 다음 해당 사용자 계정으로 서비스가 실행되고 다른 사용자는 해당 서비스를 실행할 수 없습니다.


1
답변 해주셔서 감사합니다. 그러나 내가하고 싶은 것이 아닙니다. 지금처럼 실행하려면 서비스 BST가 필요합니다. 관리자가 아닌 사용자 만 중지 / 시작할 수 있습니다.
Sach
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.