Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Самописный chmod

#winapi #c #chmod


Доброго времени суток.
По учебе задали написать аналог утилиты chmod под Windows на Си.
Но есть проблема.
chmod назначает права для владельца, группы владельца и остальных пользователей.
Но что есть группа владельца? Если владелец состоит в нескольких группах, какая группа
нужна?
И главное - какой функцией WinAPI можно получить эту группу?
Еще вопрос. 
Функция GetNamedSecurityInfo может вернуть: 

ppsidGroup [out, optional]
A pointer to a variable that receives
a pointer to the primary group SID

Что это за primary group? Это и есть группа владельца?
Назначая этой группе права, SID этой группы определяется как "None".
Будет здорово, если ответите хоть на один вопрос.    


Ответы

Ответ 1



Система прав в Windows и *nix довольно сильно отличается. В *nix у каждого файла есть 2 значение - владелец-пользователь и владелец-группа, причем пользователь не обязательно должен состоять в группе владельца файла. chmod устанавливает 9 значений. 3 права (rwx) на юзера-владельца, группу владельца, всех остальных. В Windows используются списки прав. У файла есть 1 владелец + список прав. Каждый элемент списка - это настройка прав для какой-то сущности (пользователь или группа). Соответственно Windows позволяет задать права одновременно многим пользователям и группам. В общем случае полный аналог chmod для NTFS не возможен.

Ответ 2



Разграничение прав есть и в *nix и в окнах. Группа - глобальная категория с предустановленным списком прав, каждый пользователь в той группе может иметь привилегии ниже установленных прав группы, но не выше их(Нельзя создать полноприводного админа в группе "Гости"). Группы избавляют от рутинной работы вроде такой: надо создать 6 админов. Путь без групп: создаем пользователя проставляем все права(овер9000 галочек, птичек, записей) и так 6 раз. Повесится можно уже на 3м. Путь с группой: Создать группу, проставить овер9000 птичек и т.д. и т.п., создать 6 пользователей в этой группе. Все. Второй вопрос: Возвращается указатель на родительскую группу, к которой принадлежит пользователь, что не ясно?

Ответ 3



это никак к винде не относится, у нее такого нет а задача у вас скорее всего простая: ставить или удалять доступ на чтение и все )))

Ответ 4



Толком помочь не могу, но часто пользуюсь командой attrib [Rijen2@Rijen-PC C:\cygwin\home\rijen]# attrib /? Вывод и изменение атрибутов файлов.ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [диск:] [путь] [имя_файла] [/S] [/D]] + Установка атрибута. - Снятие атрибута. R Атрибут "Только чтение". A Атрибут "Архивный". S Атрибут "Системный". H Атрибут "Скрытый". [диск:] [путь] [имя_файла] Указание файла или набора файлов для обработки. /S Обработка файлов с указанными именами в текущей папке и во всех ее подпапках. /D Обработка и файлов, и папок. А права для групп/пользователей устанавливаются через локальную политику аудита. Возможно через WinAPI это делать легче чем ручками, но не все версии окон поддерживают политики.

Ответ 5



решаема через Power Shell (пример)

Ответ 6



Есть книга автор Джонсон Харт, "Системное программирование в среде Microsoft Windows", там в одной из глав есть пример chmod на С+winapi.

Ответ 7



типичный ответ на вопрос почему "chmod не работает в Windows? Потому, что данная система прав реализована в *unix"... А вот если рассмотреть в контексте сборки WAMP и LAMP... Как известно Apache+MySQL+PHP для винды существует, и это при всяких нюансах от разницы в слэшах и т.п, казалось бы тривиальных вещей. А вот CHMOD? Да, не может php скажем корректно читать chmod когда стоит на винде. Но факт остаётся фактом. Кидаем этот файл на сервер: и вуаля? Аттрибут присутсвует, хоть гоняй по 100 раз его туда сюда. CHMOD у файла всегда будет, просто восприимчивость не та у разных ОСей. Ну вот что бесит. Понятно винду под *nix не перепишешь под apache+php, но можно же было продумать способ эмуляции chmod, для обеспечения наиболее совместимости и портируемости контента...

Комментариев нет:

Отправить комментарий