Доброго времени суток глубокоуважаемые Сразу перейду к проблеме. Написал программку которая вырубает флешку из usb. При работе под админом работает сказочно, просто чудо, а не программа. Но, при запуске под ограниченной учёткой вылазит ошибка "Отказано в доступе" при попытке доступа к тому флешки. Порыл инфы, вроде разобрался что всё из-за параметра lpSecurityAttributes функции CreateFile. При передачи в него NULL устанавливаются значения "по умолчанию", которые как раз подразумевают такое поведение. Теперь внимание вопрос: что конкретно надо передать в этом параметре, чтобы доступ к тому не ограничивался вне зависимости от привелегий той или иной учётной записи. Я перерыл весь инет, попробовал множество конструкций типа: Код (Text): SECURITY_DESCRIPTOR stSecurityDescriptor; SECURITY_ATTRIBUTES stSecurityAttributes; LPSECURITY_ATTRIBUTES lpSecurityAttributes; InitializeSecurityDescriptor(&stSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(&stSecurityDescriptor, TRUE, NULL, FALSE); stSecurityAttributes.nLength= sizeof(stSecurityAttributes); stSecurityAttributes.bInheritHandle= FALSE; stSecurityAttributes.lpSecurityDescriptor= &stSecurityDescriptor; lpSecurityAttributes= &stSecurityAttributes; и даже Код (Text): DWORD dwRes, dwDisposition; LONG lRes; PSID pEveryoneSID = NULL; PACL pACL = NULL; PSECURITY_DESCRIPTOR pSD = NULL; EXPLICIT_ACCESS ea; SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY; SECURITY_ATTRIBUTES sa; HKEY hkSub = NULL; // Create a well-known SID for the Everyone group. if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, &pEveryoneSID)) { MessageBox(NULL, _T("AllocateAndInitializeSid Error"), _T("Error"), MB_OK); goto Cleanup; } // Initialize an EXPLICIT_ACCESS structure for an ACE. // The ACE will allow Everyone read access to the key. ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); ea.grfAccessPermissions = KEY_ALL_ACCESS; ea.grfAccessMode = SET_ACCESS; ea.grfInheritance= NO_INHERITANCE; ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; ea.Trustee.ptstrName = (LPTSTR) pEveryoneSID; // Create a new ACL that contains the new ACEs. dwRes = SetEntriesInAcl(1, &ea, NULL, &pACL); if (ERROR_SUCCESS != dwRes) { MessageBox(NULL, _T("SetEntriesInAcl Error"), _T("Error"), MB_OK); goto Cleanup; } // Initialize a security descriptor. pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); if (NULL == pSD) { MessageBox(NULL, _T("LocalAlloc Error"), _T("Error"), MB_OK); goto Cleanup; } if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) { MessageBox(NULL, _T("InitializeSecurityDescriptor Error"), _T("Error"), MB_OK); goto Cleanup; } // Add the ACL to the security descriptor. if (!SetSecurityDescriptorDacl(pSD, TRUE, // bDaclPresent flag pACL, FALSE)) // not a default DACL { MessageBox(NULL, _T("SetSecurityDescriptorDacl Error"), _T("Error"), MB_OK); goto Cleanup; } // Initialize a security attributes structure. sa.nLength = sizeof (SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = pSD; sa.bInheritHandle = FALSE; и это не помогло. При этом в интернете давольно мало конкретики по этой теме, поэтому я возможно чегото немного недопонимаю. О великие гуру! Просветите мою заблудшую душу! Объясните, что я делаю не так?
Я не особо силен в Win-программировании, но думаю что открывать устройства через CreateFile можно только администраторам. В локальной политике есть такая настройка, которая позволяет разрешить это делать обычным учетным записям. Поправь меня, если я ошибаюсь...
Сомнительно. Ничего подобного там не нашёл, хотя в администрировании я не особо силён =) Вообще предпологается что параметр lpSecurityAttributes как раз и передаётся в CreateFile чтобы определить пользователей которые смогут получить доступ. Если же всё действительно так плохо, как написано выше, то хотелось бы узнать как с этим бороться. Ведь пишут както программы которые работают с устройствами не замарачиваясь на том, под чей учётной записью они запущены.
Не я имею ввиду что функция CreateFile может открывать устройства только в тех учетных записах, которые разрешены системой. По поводу драйверов. Программы часто создают свой сервис (читай служба), который запускается при загрузке ОСи. Эти сервисы работают от имени одной из системных учетных записей (например, SYSTEM), в которой можно делать все! Ни один антивирус не обходится без установки собственной службы, которая следит за обращениями к файлам и вызовами системных функций. Кстати - топик твой лучше переместить на Win-форум. Я заметил что если ты опубликовал тему на одном форуме, а он относится к другому, то на твой будут заглядывать реже. Ведь некоторые посетители сайта заглядывают только на 1-2 форума и редко проверяют сообщения на всех остальных. Попроси модераторов переместить тему на Win-форум.
Soulless Думаю, AndreyMust19 прав. Без привилегий администратора открывать тома (как и физические диски) нельзя. Именно. При создании объекта. Но не при открытии существующего. При открытии существующего Ваш процесс (или как минимум поток) уже должен обладать необходимыми правами доступа, указанными при создании объекта. Не знаю, о каких Вы программах говорите, но в лучшем случае используется имперсонация. P.S. Никогда не интересовался программными выниманием флэшек, но вот здесь не нашёл ни одного упоминания о CreateFile.
l_inc Спасибо за статью, но я не имел удовольствия писать в асме. Видимо придётсо учить ) Вобщем вы мне очень помогли, спасибо что указали верное направление. Будем копать )