아래에서는 관리자가 아닌 사용자 계정에서 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을 참조하십시오.