Необходимо синхронизировать службу Windows с пользовательским процессом без прав администратора - PullRequest
0 голосов
/ 22 октября 2011

Я использую службу (.NET2.0), чтобы периодически выполнять привилегированные действия и возвращать результат в общую память через IPC с помощью процесса пользователя без прав администратора (.NET2.0).

Я использовал мьютексы с глобальным именем при разработке из своей учетной записи администратора, но когда я прихожу попробовать приложение на ограниченной учетной записи, я получаю сообщение об ошибке:

Дополнительная информация: доступ к пути 'Global \ timersyncu33sc3c2sd42frandomlynamemmutexoijfvgf9v3f32' запрещен.

Есть ли другой способ, которым непривилегированный пользователь может взаимодействовать со Службой? Или я должен просто разделить период опроса и время обновления и надеяться, что эти значения будут записаны / прочитаны атомарно?

Ответы [ 2 ]

1 голос
/ 22 октября 2011

Я бы поговорил со службой, используя WCF. Это устраняет проблему привилегий / идентичности. Однако, поскольку ваш код находится в .NET 2.0, вы можете использовать Remoting или NamedPipes для общения со службой.

0 голосов
/ 31 октября 2011

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