CreateNamedPipe
Windows APIを使用して二重の名前付きパイプを作成し、シェル拡張とメインのデスクトップ アプリケーション間の IPC に使用しようとしています。
リモート接続を防止する、Vista 以降の関数に渡すことができるフラグがあります ( PIPE_REJECT_REMOTE_CLIENTS
)。私が理解していることから、それはパイプが同じマシンでのみ接続可能であることを意味します。以前のバージョンの Windows で同じ機能を取得する方法を知っている人はいますか? 次のコードでオブジェクトを作成しようとしましたSECURITY_ATTRIBUTES
が、正しく動作しているかどうか完全にはわかりません:
static bool GetLocalMachineOnlySecurityAttributes (SECURITY_ATTRIBUTES& sa)
{
PSID plocalsid = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_LOCAL_SID_AUTHORITY;
if(!::AllocateAndInitializeSid (&SIDAuthWorld, 1, SECURITY_LOCAL_RID, 0, 0, 0, 0, 0, 0, 0, &plocalsid))
return false;
EXPLICIT_ACCESS ea = {0};
ea.grfAccessPermissions = SPECIFIC_RIGHTS_ALL | STANDARD_RIGHTS_ALL;
ea.grfAccessMode = SET_ACCESS;
ea.grfInheritance = NO_INHERITANCE;
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea.Trustee.ptstrName = reinterpret_cast<LPWSTR>(plocalsid);
PACL acl = NULL;
if(!::SetEntriesInAcl (1, &ea, NULL, &acl))
return false;
//PSECURITY_DESCRIPTOR sd = reinterpret_cast<PSECURITY_DESCRIPTOR>(::LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH));
static SECURITY_DESCRIPTOR sd = {0};
if(!::InitializeSecurityDescriptor (&sd, SECURITY_DESCRIPTOR_REVISION))
return false;
if(!::SetSecurityDescriptorDacl(&sd, TRUE, acl, FALSE))
return false;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = &sd;
sa.bInheritHandle = FALSE;
return true;
}
私が正しいことをしているかどうか、または の決定的な説明を探すことができる場所を教えてくれる人がいれば、SECURITY_ATTRIBUTES
とても感謝しています.