我被困在为SECURITY_ATTRIBUTES方法指定CreateNamedPipe(最后一个参数)。我想允许每个人都具有完全访问权限。

我可以汇编的最深入的代码是这样的:

public static HANDLE CreateNamedPipe(String pipeName, PipeDirection pipeDirection, int maxConnections) throws NamedPipeException {
    WinBase.SECURITY_ATTRIBUTES saAttr = new WinBase.SECURITY_ATTRIBUTES();
    saAttr.dwLength = new WinDef.DWORD(saAttr.size());
    saAttr.bInheritHandle = true;
    saAttr.lpSecurityDescriptor = null; // it gives default access rights. I need full control for everyone

    HANDLE handle = Kernel32.INSTANCE.CreateNamedPipe(pipeName,
        pipeDirection.getValue(),
        WinBase.PIPE_TYPE_BYTE | WinBase.PIPE_WAIT,
        maxConnections,
        Integer.MAX_VALUE,
        Integer.MAX_VALUE,
        0,
        saAttr);

    int error = Kernel32.INSTANCE.GetLastError();
    if(error != 0) {
        throw new NamedPipeException(error);
    }
    return handle;
}


lpSecurityDescriptor设置为null会提供默认访问权限,但我希望所有人都拥有完全控制权。

最佳答案

这并不是完全的答案,但我希望它能有所帮助。

如果您不想对saAttr进行任何操作,则只需将null作为最后一个参数(而不是saAttr),然后管道将使用默认的安全描述符。来自Microsoft的引用(https://msdn.microsoft.com/en-us/library/windows/desktop/aa365150(v=vs.85).aspx,lpSecurityAttributes):


  命名管道的默认安全描述符中的ACL将完全控制权授予LocalSystem帐户,管理员和创建者所有者。他们还向所有人组和匿名帐户的成员授予读取权限。

关于java - 如何为CreateNamedPipe指定SECURITY_ATTRIBUTES?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38033156/

10-08 21:16