2010-07-19 6 views
3

곧 제발 도와주세요 null를 돌려줍니다. 나는 서비스를 실행하기 위해 C++ 코드를 작성하고, 그것은, OpenSCManager() 함수는 null 관리자 계정 에 있지만 관리자가 아닌 사용자 계정에서 잘 작동합니다. 관리자가 아닌 사용자 계정에 서비스를 시작하고 중지 할 수있는 권한을 부여하는 방법을 알려주십시오. 아니면 다른 일을해야합니까? 답장을 보내주십시오.() 함수는

+0

NULL을 가져온 후 GetLastError() API 호출이 반환하는 것은 무엇입니까? Visual C++를 사용하는 경우 OpenSCManager() 호출에 중단 점을 넣고 조사 식 창에서 '단계'와 '@err'을 넣을 수 있습니다.이 값은 무엇입니까? 그러한 포괄적 인 답변을 얻으려면 +1 – JBRWilkinson

답변

11

SC_MANAGER_ALL_ACCESS 플래그를 지정하는 OpenSCManager을 호출하는 것이 좋습니다. 실제로는 기본적으로 관리자에게만 부여되는 권한 집합이 필요합니다. 여기에서 서비스를 시작/중지하려면 SC_MANAGER_CONNECT 플래그를 지정하면됩니다.이 플래그는 기본적으로 모든 인증 된 사용자에게 제공됩니다.

는 이제 서비스 관리자에 대한 핸들을 가지고, 당신은 서비스에 대한 핸들을 얻을 수 OpenService을 사용해야합니다. 시작/당신이 원하는 액세스로 GENERIC_READ | GENERIC_EXECUTE를 지정해야 서비스를 중지 할 수있는 권한을 가지고 (사실 나는 SERVICE_INTERROGATE, 필요한 경우에도, 단지 SERVICE_STARTSERVICE_STOP에 필요한 권한을 좁혀 수 있다고 생각합니다). 여기에표준 서비스 DACL은 일반 사용자에게 이러한 권한을 부여하지 않으므로 일반 사용자가 시작/중지 할 수 있도록 시작해야하는 서비스의 DACL을 변경해야합니다. here을 참조하십시오. 서비스에 대한 액세스 권한에 대한 자세한 내용은 here을 참조하십시오.

단일 서비스 대신 정상적인 사용자가 서비스를 시작/중지하도록 허용하려는 경우 모든 DACL을 변경하지 않고 가능한지 여부를 알 수 없지만 내 의견으로는 분명히 나쁜 생각입니다. .

단일 서비스의 경우에도 서비스가 권한있는 계정 (예 : LocalSystem)으로 실행되고 있거나 중요한 시스템 서비스 인 경우 권한이없는 사용자가 그 서비스를 혼란에 빠뜨리면 여전히 나쁜 생각입니다. 사용자가 시스템에서 중요하지 않은 서비스 만 시작/중지 할 수 있도록해야합니다. 호기심에서

, 왜 사용자가 서비스를 시작/중지하도록해야합니까?

+0

+1! – JBRWilkinson

+0

감사합니다! :이 서비스 매니저 자체에 대한 권한을 변경할 수 있습니다, 미래의 참고 –

+0

를 (임의의 텍스트는 15 자 얻기 위해) (아마 좋은 생각은 아니지만!) 예를 들어, http://support.microsoft.com을 참조/kb/907460 –