ログオンしてGUIを起動するときに、限られたユーザーにアクセスを許可する次の方法が見つかりました。関数getUsername(/*somehow*/);
にはいくつかの実装があり、私はXPで動作する実装をリストしていないことに注意してください。私が見つけた4つのうち3つは私のためには機能しませんでした。
void grantMutexToCurUser(Mutex ^%fpMutex) {
try {
fpMutex = Mutex::OpenExisting(ServerGUIBridge::NAMEDMUTEXFORTIMERSYNC,
static_cast<MutexRights>(
MutexRights::ReadPermissions | MutexRights::ChangePermissions));
MutexSecurity^ mSec = fpMutex->GetAccessControl();
String^ user;
try {
user = getUsername(/*somehow*/);
Trace::WriteLine(DateTime::Now.ToLongTimeString() + " - Granting mutex access to: "
+ user , "grantMutexToCurUser");
} catch (Exception ^ex) {
Trace::WriteLine("getUsername: " + ex->Message, "grantMutexToCurUser");
}
// First, the rule that denied the current user the right to enter and
// release the mutex must be removed.
MutexAccessRule^ rule = gcnew MutexAccessRule(user,
static_cast<MutexRights>(MutexRights::Synchronize
| MutexRights::Modify), AccessControlType::Deny);
mSec->RemoveAccessRule(rule);
// Now grant the user the correct rights.
rule = gcnew MutexAccessRule(user,
static_cast<MutexRights>(MutexRights::Synchronize
| MutexRights::Modify), AccessControlType::Allow);
mSec->AddAccessRule(rule);
fpMutex->SetAccessControl(mSec);
// Open the mutex with (MutexRights.Synchronize | MutexRights.Modify), the
// rights required to enter and release the mutex.
fpMutex = Mutex::OpenExisting(ewfmon::ServerGUIBridge::NAMEDMUTEXFORTIMERSYNC);
//noThrowRelease(fpMutex);
}
catch (UnauthorizedAccessException^ ex)
{
Trace::WriteLine(DateTime::Now.ToLongTimeString() + " - Unable to change permissions: "
+ ex->Message, "grantMutexToCurUser");
}
}
IPCに使用しているミューテックスと共有メモリにACLを設定しましたか? –
Seva Titov先週、このようなソリューションを実装しましたが、正常に動作します。 – John