Используйте 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);
}

Смотрите статью для более подробной информации и комментариев

Другие вопросы по тегам