2011-10-21 17 views
0

(.NET2.0)サービスを定期的に実行して、管理者以外のユーザーの(IPCを使用して)共有メモリに結果を返します。 NET2.0)プロセス。私の管理者アカウントから開発が、私は限られたアカウントでアプリケーションを試しに来たとき、私はエラーを取得しながら、私は世界的に名前のミューテックスを使用しているWindowsのサービスと管理者以外のユーザーのプロセスを同期させる必要があります

Additional information: Access to the path 'Global\timersyncu33sc3c2sd42frandomlynamedmutexoijfvgf9v3f32' is denied.

は非特権他のいくつかの方法がありますユーザーはサービスと対話できますか?あるいは、ポーリングと更新の時間を分かち合うだけで、それらの値が原子的に書かれたり読み取られたりすることを望みますか?

+0

IPCに使用しているミューテックスと共有メモリにACLを設定しましたか? –

+0

Seva Titov先週、このようなソリューションを実装しましたが、正常に動作します。 – John

答えて

0

ログオンして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"); 
    } 
} 
1

私はWCFを使用してサービスに話します。これにより、権限/同一性の問題が解消されます。 しかし、あなたのコードは.NET 2.0にあるので、RemotingまたはNamedPipeを使ってサービスと話すことができます。

+0

.NET 2.0ではWCFがありません。ああ、NamedPipesを追加してみてください。これは、ローカルマシン上の通信としてオーバーヘッドを上げます。これは、IPCではなく、読者とライターの発射を同期させることが問題です。 – John

+0

良い解決方法は、http://bartdesmet.net/blogs/bart/archive/2007/04/12/getting-started-with-named-pipes.aspxを参照してください。スタックオーバーフロー。 – John

+0

Doh! http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeclientstream.aspx#Y0 NamedPipesは.NET 2.0では使用できません。 Remotingがあまりにも多いです(それは.NETですか?)。確かに良いソリューションがありますか? – John

関連する問題