使用ShellExecute可以使用多个参数运行icacl

Use ShellExecute to run icacls with multiple parameters

本文关键字:参数 运行 icacl ShellExecute 可以使 使用      更新时间:2023-10-16

我正在尝试从c++执行icacls。下面的代码没有任何作用。我仍然不知道为什么它什么都没做。我看不到icacl返回给我什么,因为cmd窗口自动关闭。HINSTANCE也没有给我太多帮助。如何使用具有多个参数的icacls?

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

您的lpFile参数可能应该是扩展名为.exe"icacls.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不是picknick(,您可能会受到以下示例的激励来集成一些。NET代码(基于C++/CLI或Interop?(


有什么不使用C#代码的具体原因吗?

AddFileSecurity(fileName, @"DomainNameAccountName",
        FileSystemRights.ReadData, AccessControlType.Allow);
RemoveFileSecurity(fileName, @"DomainNameAccountName",
        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);
}

有关完整的详细信息和评论,请参阅文章