Используйте ShellExecute для запуска icacls с несколькими параметрами - PullRequest
0 голосов
/ 13 ноября 2011

Я пытаюсь выполнить 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 ]

1 голос
/ 13 ноября 2011

Ваш параметр lpFile, вероятно, должен быть "icacls.exe" с расширением .exe.

Кроме того, вы всегда должны проверять наличие ошибок.Если ShellExecute() завершается успешно, возвращается значение больше 32. Список кодов ошибок, которые могут быть возвращены, см. MSDN .

0 голосов
/ 14 ноября 2011

В целях тестирования вы можете посмотреть на вывод из icacls, обернув его в cmd /k:

HINSTANCE hInst = ShellExecute( NULL,
    NULL,
    L"cmd",
    L"/k icacls s.jpg /grant %username%:W",
    L"C:/",
    SW_NORMAL
);

[Почему grant:r?]

0 голосов
/ 13 ноября 2011

Удаление сообщения:

Я написал этот фрагмент кода ранее, к сожалению, он специфичен для CLR / .NET.Тем не менее, поскольку вы заявили, что использовать «API» сложно (да, я это сделал 10 лет назад, а NTFS ACLS - не пикантность), приведенный ниже пример может побудить вас интегрировать немного кода .NET (C ++ /CLI или Interop based?)


Любая конкретная причина не использовать код 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);
}

Подробную информацию и комментарии см. В статье

...