Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2020, 19:00   #1
Maxim_St
Пользователь
 
Регистрация: 10.05.2017
Сообщений: 23
По умолчанию Как получить права и разрешения службы(Разрешено ли делать "Старт\Стоп\Пауза")?

Здравствуйте.

В диспетчере служб некоторые службы нельзя "остановить", "запустить", изменить "тип запуска" и т.д..

Например --- Schedule -> Планировщик заданий,
Power -> Питание.

Как это можно узнать?

Пытался использовать функции
"QueryServiceObjectSecurity",
GetSecurityDescriptorDacl,
GetAclInformation,
GetAce.
Но не разобрался в справке MSDN и с флагами.
Все указанные функции отрабатывают без ошибок.

Помогите пожалуйста.
Maxim_St вне форума Ответить с цитированием
Старый 14.06.2020, 19:30   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Maxim_St Посмотреть сообщение
Помогите пожалуйста
Что конкретно не понятно?
waleri вне форума Ответить с цитированием
Старый 14.06.2020, 20:10   #3
Maxim_St
Пользователь
 
Регистрация: 10.05.2017
Сообщений: 23
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Что конкретно не понятно?
Хочу узнать, могу ли я остановить, запустить и т.д. сервис? Как в свойствах сервиса.


Но я не знаю как это сделать.


Да и на сайте MSDN не все параметры описаны.
Что-то типа:
arg
arg
arg
и так далее, не описания.

Не знаю какой флаг отвечает то что мне надо.


Делал на примере Доступа к файлу из инета.

Ниже только черновик.
Код:
   PSECURITY_DESCRIPTOR sd = NULL;
   DWORD cbBufSizeSD = 0,
   pcbBytesNeededSD = 0;
	if (QueryServiceObjectSecurity(hop, 
                    OWNER_SECURITY_INFORMATION |GROUP_SECURITY_INFORMATION |
                    DACL_SECURITY_INFORMATION, 
                    sd, 0, &pcbBytesNeededSD) == 0)
	{
		if ((ERROR_INSUFFICIENT_BUFFER == GetLastError()) && (pcbBytesNeededSD > 0))
		{
			sd = (PSECURITY_DESCRIPTOR)malloc(pcbBytesNeededSD);
			if (sd != NULL)
			{
				cbBufSizeSD = pcbBytesNeededSD;
			}
		}
	}

	if (sd != NULL)
	{
		pcbBytesNeededSD = 0;
		if (QueryServiceObjectSecurity(hop, 
                                  OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | 
                                  DACL_SECURITY_INFORMATION,
				sd, cbBufSizeSD, &pcbBytesNeededSD) != 0)
		{
			LPWSTR fff = NULL;
			ConvertSecurityDescriptorToStringSecurityDescriptorW(sd, SDDL_REVISION_1, 																		 
                                         OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION |																		 
                                         DACL_SECURITY_INFORMATION,
					&fff,
					NULL);
			LocalFree(fff);

			BOOL DaclF, AclDefF;
					//QuerySecurityAccessMask(sd,)
			const int  ACL_SIZE = 1024;
			BYTE DAcl[ACL_SIZE];
			PACL pAcl = (PACL)&DAcl;

			if (GetSecurityDescriptorDacl(sd, &DaclF, &pAcl, &AclDefF) != 0)
			{
				ACL_SIZE_INFORMATION ASizeInfo;
				if (GetAclInformation(pAcl, &ASizeInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation) != 0)
				{
					DWORD PBits = 0; /* Вычислить разрешения на доступ на основе ACL. */
					PACCESS_ALLOWED_ACE pAce;
					for (DWORD iAce = 0; iAce < ASizeInfo.AceCount; iAce++)
					{
						if (GetAce(pAcl, iAce, (PVOID*)&pAce) != 0)
						{

							byte AType = pAce->Header.AceType;
							if (AType == ACCESS_ALLOWED_ACE_TYPE)
							{
								if ((pAce->Header.AceFlags & FAILED_ACCESS_ACE_FLAG) == FAILED_ACCESS_ACE_FLAG)
								{
									Sleep(0);// точка останова
								}
								if ((pAce->Mask & 28) == 28)
								{
									Sleep(0);
								}
								PBits |= (0x1 << (8 - iAce));
							}
						}
					}


					wchar_t PermString[] = L"---------";
					const wchar_t RWX[] = { 'r','w','x' }, FileTypeChar[] = { ' ', 'd' };
					DWORD Mode = PBits;
					if (Mode == 0xFFFFFFFF)
						Mode = 0;
					for (int i = 0; i < 9; i++)
					{
						if (Mode >> (8 - i) & 0x1)
						{
							PermString[i] = RWX[i % 3];
						}
					}

						wchar_t outS[1000] = { 0 };
						swprintf_s(outS, 1000, L"%s", PermString);
					}
				}


					PSID pOwnerSid, pGroupSid;
					BOOL OwnerDefF, GroupDefF;
					GetSecurityDescriptorOwner(sd, &pOwnerSid, &OwnerDefF);
					GetSecurityDescriptorGroup(sd, &pGroupSid, &GroupDefF);


					wchar_t UsrNm[260], GrpNm[260];
					DWORD _Needed = 260;
					DWORD _DomLen = 260;
				//	/*ULONG DOM_SIZE = LUSIZE;
					wchar_t RefDomain[2][260];
				//	DWORD AcctSize[] = { ACCT_NAME_SIZE, ACCT_NAME_SIZE };*/

					SID_NAME_USE sNamUse[2];
					LookupAccountSidW(NULL, pOwnerSid, UsrNm, /*&AcctSize[0]*/&_Needed, RefDomain[0], &_DomLen, &sNamUse[0]);
					_Needed = 260;
					_DomLen = 260;
					LookupAccountSidW(NULL, pGroupSid, GrpNm, &_Needed, RefDomain[1], &_DomLen, &sNamUse[1]);

					Sleep(0);

					free(sd);
				}
			}

Последний раз редактировалось Maxim_St; 14.06.2020 в 20:21.
Maxim_St вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Как исправить кнопку "старт" в этой программе? Roblen Паскаль, Turbo Pascal, PascalABC.NET 1 27.05.2015 22:03
--== Кнопки "Старт" "Стоп" ==-- Shpion007 Общие вопросы C/C++ 39 04.01.2013 22:41
"Стоп Хам" кто, за чей счёт, цели - от куда ноги растут? С.М.С Свободное общение 13 26.06.2012 12:16
блок "cont" с права не принимает значение "margin: 10px;" которое описано в body tabikA HTML и CSS 5 24.02.2009 21:50