2011-07-29 15 views
7

MSDN, RevertToSelf() başarısız olursa, programın derhal sonlandırılması gerektiğini, aksi halde, kimliğe bürünmediği ve uygun olmayan bir istemci adına çalışmaya devam ettiğini belirtir. Şimdi ImpersonateSelf() öğesi başarısız olduktan sonra RevertToSelf() öğesi önemli midir?

ImpersonateSelf(SecurityImpersonation); 

yapmak varsayalım ve çağrı sonra RevertToSelf() arayıp ikincisi başarısız yerine geldi. İş parçacığı, geçerli işlemin ayrıcalıklarıyla çalışmaya devam eder. Bu da çok mu kötü?

+0

Bu, başarısız olmanın imkansız olduğu işlevlerden biri gibi görünüyor. Düşünebildiğim tek başarısızlık senaryosu, kendinizi (sonra denemek için çok tembel olduğum halde) kendiniz taklit ettikten sonra iş parçacığı (veya süreç?) Için DACL'deki "Set Thread Token" iznini reddetmektir. Kimliğe bürünme ile ilgili olan şey, * iş parçacığının erişmeye çalıştığı her şeyi etkilemesidir. Muhtemelen ölümcül olmama noktasında kesinlikle “imkansız” olma ve önlem alma (muhtemelen kendini taklit etmeme ve kendini taklit etme arasında pratik bir fark olmasa bile) almayı düşünürdüm. – Luke

cevap

4

Sorunuzu beğeniyorum ve MSDN bu konuda net değil.

Ben

  • OpenProcessToken
  • DuplicateTokenEx (... TokenImpersonation ...)
  • arayarak tüm çalışma kendiniz yapabileceğini gelmez 117'ye ImpersonateSelf için Programming Windows Security (Keith Brown) sayfalarında 112 baktı
  • SetThreadToken
  • CloseHandle

ikensadece iki boş parametreler önceki belirteci dönmek yöntemi talimat Geçme

SetThreadToken(0,0) 

için bir çağrıdır. Kimliğe bürünme ve birincil simge ve simge erişim haklarıyla uğraşmak zorunda değilsiniz. Çağrı her zaman başarılı olacaktır.

RpcRevertToSelf işlevinin hata kodlarına bakarsanız, RPC ile ilgili kodları bir kenara ayırırsanız, tek bir hata modu, kimliğe bürünme yapmadığınız takdirde olur.

RevertToSelf (ImpersonateSelf ile aynı iş parçacığından çağrılır) her zaman başarılı olacağının varsayılmasının güvenli olduğunu söyleyebilirim.