Отказ получения доступа CreateFile

Тема в разделе "LANGS.C", создана пользователем Soulless, 25 дек 2008.

  1. Soulless

    Soulless New Member

    Публикаций:
    0
    Регистрация:
    25 дек 2008
    Сообщения:
    3
    Доброго времени суток глубокоуважаемые :)
    Сразу перейду к проблеме. Написал программку которая вырубает флешку из usb. При работе под админом работает сказочно, просто чудо, а не программа. Но, при запуске под ограниченной учёткой вылазит ошибка "Отказано в доступе" при попытке доступа к тому флешки.
    Порыл инфы, вроде разобрался что всё из-за параметра lpSecurityAttributes функции CreateFile. При передачи в него NULL устанавливаются значения "по умолчанию", которые как раз подразумевают такое поведение. Теперь внимание вопрос: что конкретно надо передать в этом параметре, чтобы доступ к тому не ограничивался вне зависимости от привелегий той или иной учётной записи.
    Я перерыл весь инет, попробовал множество конструкций типа:
    Код (Text):
    1. SECURITY_DESCRIPTOR stSecurityDescriptor;
    2. SECURITY_ATTRIBUTES stSecurityAttributes;
    3. LPSECURITY_ATTRIBUTES lpSecurityAttributes;
    4.  
    5. InitializeSecurityDescriptor(&stSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);
    6. SetSecurityDescriptorDacl(&stSecurityDescriptor, TRUE, NULL, FALSE);
    7. stSecurityAttributes.nLength= sizeof(stSecurityAttributes);
    8. stSecurityAttributes.bInheritHandle= FALSE;
    9. stSecurityAttributes.lpSecurityDescriptor= &stSecurityDescriptor;
    10.  
    11. lpSecurityAttributes= &stSecurityAttributes;
    и даже

    Код (Text):
    1. DWORD dwRes, dwDisposition;
    2.     LONG lRes;
    3.     PSID pEveryoneSID = NULL;
    4.     PACL pACL = NULL;
    5.     PSECURITY_DESCRIPTOR pSD = NULL;
    6.     EXPLICIT_ACCESS ea;
    7.     SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
    8.     SECURITY_ATTRIBUTES sa;
    9.     HKEY hkSub = NULL;
    10.  
    11.     // Create a well-known SID for the Everyone group.
    12.     if(!AllocateAndInitializeSid(&SIDAuthWorld, 1,
    13.                      SECURITY_WORLD_RID,
    14.                      0, 0, 0, 0, 0, 0, 0,
    15.                      &pEveryoneSID))
    16.     {
    17.         MessageBox(NULL, _T("AllocateAndInitializeSid Error"), _T("Error"), MB_OK);
    18.         goto Cleanup;
    19.     }
    20.  
    21.     // Initialize an EXPLICIT_ACCESS structure for an ACE.
    22.     // The ACE will allow Everyone read access to the key.
    23.     ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
    24.     ea.grfAccessPermissions = KEY_ALL_ACCESS;
    25.     ea.grfAccessMode = SET_ACCESS;
    26.     ea.grfInheritance= NO_INHERITANCE;
    27.     ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
    28.     ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
    29.     ea.Trustee.ptstrName  = (LPTSTR) pEveryoneSID;
    30.  
    31.     // Create a new ACL that contains the new ACEs.
    32.     dwRes = SetEntriesInAcl(1, &ea, NULL, &pACL);
    33.     if (ERROR_SUCCESS != dwRes)
    34.     {
    35.         MessageBox(NULL, _T("SetEntriesInAcl Error"), _T("Error"), MB_OK);
    36.         goto Cleanup;
    37.     }
    38.      // Initialize a security descriptor.  
    39.     pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,
    40.                              SECURITY_DESCRIPTOR_MIN_LENGTH);
    41.     if (NULL == pSD)
    42.     {
    43.         MessageBox(NULL, _T("LocalAlloc Error"), _T("Error"), MB_OK);
    44.         goto Cleanup;
    45.     }
    46.     if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
    47.     {  
    48.         MessageBox(NULL, _T("InitializeSecurityDescriptor Error"), _T("Error"), MB_OK);
    49.         goto Cleanup;
    50.     }
    51.  
    52.     // Add the ACL to the security descriptor.
    53.     if (!SetSecurityDescriptorDacl(pSD,
    54.             TRUE,     // bDaclPresent flag  
    55.             pACL,
    56.             FALSE))   // not a default DACL
    57.     {  
    58.         MessageBox(NULL, _T("SetSecurityDescriptorDacl Error"), _T("Error"), MB_OK);
    59.         goto Cleanup;
    60.     }
    61.  
    62.     // Initialize a security attributes structure.
    63.     sa.nLength = sizeof (SECURITY_ATTRIBUTES);
    64.     sa.lpSecurityDescriptor = pSD;
    65.     sa.bInheritHandle = FALSE;
    и это не помогло. При этом в интернете давольно мало конкретики по этой теме, поэтому я возможно чегото немного недопонимаю. О великие гуру! Просветите мою заблудшую душу! Объясните, что я делаю не так?
     
  2. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Я не особо силен в Win-программировании, но думаю что открывать устройства через CreateFile можно только администраторам. В локальной политике есть такая настройка, которая позволяет разрешить это делать обычным учетным записям.
    Поправь меня, если я ошибаюсь...
     
  3. Soulless

    Soulless New Member

    Публикаций:
    0
    Регистрация:
    25 дек 2008
    Сообщения:
    3
    Сомнительно. Ничего подобного там не нашёл, хотя в администрировании я не особо силён =) Вообще предпологается что параметр lpSecurityAttributes как раз и передаётся в CreateFile чтобы определить пользователей которые смогут получить доступ. Если же всё действительно так плохо, как написано выше, то хотелось бы узнать как с этим бороться. Ведь пишут както программы которые работают с устройствами не замарачиваясь на том, под чей учётной записью они запущены.
     
  4. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Не я имею ввиду что функция CreateFile может открывать устройства только в тех учетных записах, которые разрешены системой.
    По поводу драйверов. Программы часто создают свой сервис (читай служба), который запускается при загрузке ОСи. Эти сервисы работают от имени одной из системных учетных записей (например, SYSTEM), в которой можно делать все! Ни один антивирус не обходится без установки собственной службы, которая следит за обращениями к файлам и вызовами системных функций.
    Кстати - топик твой лучше переместить на Win-форум. Я заметил что если ты опубликовал тему на одном форуме, а он относится к другому, то на твой будут заглядывать реже. Ведь некоторые посетители сайта заглядывают только на 1-2 форума и редко проверяют сообщения на всех остальных. Попроси модераторов переместить тему на Win-форум.
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Soulless
    Думаю, AndreyMust19 прав. Без привилегий администратора открывать тома (как и физические диски) нельзя.
    Именно. При создании объекта. Но не при открытии существующего. При открытии существующего Ваш процесс (или как минимум поток) уже должен обладать необходимыми правами доступа, указанными при создании объекта.
    Не знаю, о каких Вы программах говорите, но в лучшем случае используется имперсонация.
    P.S. Никогда не интересовался программными выниманием флэшек, но вот здесь не нашёл ни одного упоминания о CreateFile.
     
  6. Soulless

    Soulless New Member

    Публикаций:
    0
    Регистрация:
    25 дек 2008
    Сообщения:
    3
    l_inc
    Спасибо за статью, но я не имел удовольствия писать в асме. Видимо придётсо учить )

    Вобщем вы мне очень помогли, спасибо что указали верное направление. Будем копать )