Я нашел следующий метод предоставления доступа моим пользователям с ограниченными правами при входе в систему и запуске графического интерфейса пользователя.Обратите внимание, что у функции getUsername(/*somehow*/);
было несколько воплощений, и я не перечисляю реализацию, которая работала на XP, я уверен, что есть другие способы, хотя 3 из 4, которые я нашел, не сработали для меня.
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" );
}
}