ShellExecuteを使用して、複数のパラメータでicaclsを実行する

私はC + +からicaclsを実行しようとしています。以下のコードは何もしません。私はまだそれが何もしない理由を知らない。私はcmdのウィンドウが自動的に閉じられるので、icaclsが私に戻ってくるのを見ることができません。 HINSTANCEはまた私に多くを提供しません。私はどのように複数のパラメータでicaclsを使用できますか?

HINSTANCE hInst = ShellExecute( NULL, 
NULL,  
L"icacls",  
L"s.jpg /grant:r %username%:W",     
L"C:/",    
SW_NORMAL 
); 
1
あなたはバッチファイルを書いていません。おそらく、適切なWin32 APIを呼び出すほうがよいでしょうか?
追加された 著者 Neil,
hInst をチェックしてエラーが発生していないかどうか確認しましたか?関数が成功すると、32より大きい値が返されます。
追加された 著者 philipvr,
win32 Apisを使用することはあなたの考えるよりも難しいです。それも試してみましたが、そこにも多くはできませんでした。
追加された 著者 user1042321,

3 答え

あなたの lpFile パラメータは、 .exe 拡張子を持つ "icacls.exe" である必要があります。

また、常にエラーをチェックする必要があります。 ShellExecute()が成功すると、32を超える値が返されます。 MSDN を参照してください。

1
追加された

投稿を元に戻す:

以前はこのコードを書きましたが、残念ながらCLR/.NET固有のコードです。しかし、あなたは 'the API'を使用することは難しいと主張しているので(10年前に行ったことですが、NTFS ACLSはpicknickではありません)、下記のサンプルで動機づけられて、.NETコード(C ++/CLIまたはInteropベース?)


C#コードを使用しない特定の理由はありますか?

AddFileSecurity(fileName, @"DomainName\AccountName",
        FileSystemRights.ReadData, AccessControlType.Allow);

RemoveFileSecurity(fileName, @"DomainName\AccountName",
        FileSystemRights.ReadData, AccessControlType.Allow);

MSDN:方法:アクセスコントロールリストのエントリの追加または削除のヘルプ<// a>:

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);
}

詳細とコメントは記事を参照

0
追加された
クライアントはC ++コードが必要です
追加された 著者 user1042321,

テスト目的のために、 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
追加された
@ user1042321書き込み専用アクセスは珍しい選択です...
追加された 著者 Neil,
ありがとうございました:) r
追加された 著者 user1042321,