Используйте ShellExecute для запуска icacls с несколькими параметрами
Я пытаюсь выполнить icacls из C++. Код ниже ничего не делает. Я до сих пор не знаю, почему это ничего не делает. Я не вижу, что мне возвращают icacls, потому что окна cmd автоматически закрываются. HINSTANCE также не дает мне много. Как я могу использовать icacls с несколькими параметрами?
HINSTANCE hInst = ShellExecute( NULL,
NULL,
L"icacls",
L"s.jpg /grant:r %username%:W",
L"C:/",
SW_NORMAL
);
3 ответа
Ваш lpFile
параметр наверное должен быть "icacls.exe"
с .exe
расширение.
Также вы всегда должны проверять наличие ошибок. Если ShellExecute()
успешно, он возвращает значение больше 32. См. MSDN для списка кодов ошибок, которые могут быть возвращены.
В целях тестирования вы можете посмотреть на вывод icacls
завернув его в cmd /k
:
HINSTANCE hInst = ShellExecute( NULL,
NULL,
L"cmd",
L"/k icacls s.jpg /grant %username%:W",
L"C:/",
SW_NORMAL
);
[Зачем grant:r
?]
Удаление поста:
Я написал этот фрагмент кода ранее, к сожалению, он специфичен для CLR/.NET. Тем не менее, поскольку вы заявили, что использовать "API" сложно (да, я это сделал 10 лет назад, а NTFS ACLS - не пикантность), приведенный ниже пример может побудить вас интегрировать немного кода.NET (C++/CLI или Interop основан?)
Любая конкретная причина не использовать код C#?
AddFileSecurity(fileName, @"DomainName\AccountName",
FileSystemRights.ReadData, AccessControlType.Allow);
RemoveFileSecurity(fileName, @"DomainName\AccountName",
FileSystemRights.ReadData, AccessControlType.Allow);
Со следующими помощниками из MSDN: Как: добавить или удалить записи списка контроля доступа:
public static void AddFileSecurity(string fileName, string account,
FileSystemRights rights, AccessControlType controlType)
{
FileSecurity fSecurity = File.GetAccessControl(fileName);
fSecurity.AddAccessRule(new FileSystemAccessRule(account,
rights, controlType));
File.SetAccessControl(fileName, fSecurity);
}
public static void RemoveFileSecurity(string fileName, string account,
FileSystemRights rights, AccessControlType controlType)
{
FileSecurity fSecurity = File.GetAccessControl(fileName);
fSecurity.RemoveAccessRule(new FileSystemAccessRule(account,
rights, controlType));
File.SetAccessControl(fileName, fSecurity);
}
Смотрите статью для более подробной информации и комментариев