Я пытаюсь создать дуплексный именованный канал в Windows, используя Golang и пакет https://pkg.go.dev/github.com/Microsoft/go-winio.
Клиент запускается как обычный процесс, но сервер работает с повышенными правами (клиент запускает сервер через ShellExecute и команду «runas»), оба должны иметь возможность чтения и записи в канал.
Клиент может читать (при тестировании с использованием os.Open), но получает ошибку golang.org/x/sys/windows.ERROR_ACCESS_DENIED (5) при выполнении чтения/записи.
Код сервера:
// ...
_ = os.Remove(pipePath)
pc := &winio.PipeConfig{
InputBufferSize: 512,
OutputBufferSize: 512,
}
l, err := winio.ListenPipe(pipePath, pc)
if err != nil {
fmt.Println("Error creating pipe: ", err)
os.Exit(255)
}
defer func(l net.Listener) {
_ = l.Close()
}(l)
for {
conn, err := l.Accept()
if err != nil {
fmt.Println("Error accepting connection: ", err)
continue
}
// ...
}
// ...
Я пробовал много разных SecurityDescriptor в winio.PipeConfig, но безрезультатно.
и код клиента:
// ...
conn, err := winio.DialPipe(pipePath, nil)
// ...
Заранее спасибо.





Нашел ответ на свой вопрос, используя SecurityDescriptor D:P(A;;GA;;;AU), причем интересная часть: A;;GA;;;AU Разрешить Generic All (чтение/запись) всем аутентифицированным пользователям. Я дополнительно ограничил дескриптор, заменив часть AU на SID текущего пользователя, чтобы доступ имел только текущий аутентифицированный пользователь.
Вам необходимо определить правильный SecurityDescriptor. Вероятно, вам потребуется предоставить тот, который, по вашему мнению, будет работать, и тогда, возможно, кто-нибудь поможет вам его исправить.