Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / clr / src / BCL / System / Security / Principal / WindowsImpersonationContext.cs / 1 / WindowsImpersonationContext.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // // WindowsImpersonationContext.cs // // Representation of an impersonation context. // namespace System.Security.Principal { using Microsoft.Win32; using Microsoft.Win32.SafeHandles; using System.Runtime.InteropServices; using System.Security.Permissions; using System.Runtime.ConstrainedExecution; [System.Runtime.InteropServices.ComVisible(true)] public class WindowsImpersonationContext : IDisposable { private SafeTokenHandle m_safeTokenHandle = SafeTokenHandle.InvalidHandle; private WindowsIdentity m_wi; private FrameSecurityDescriptor m_fsd; private WindowsImpersonationContext () {} internal WindowsImpersonationContext (SafeTokenHandle safeTokenHandle, WindowsIdentity wi, bool isImpersonating, FrameSecurityDescriptor fsd) { // make this a no-op on Win98 so calling code does not have to special case down-level platforms. if (WindowsIdentity.RunningOnWin2K) { if (safeTokenHandle.IsInvalid) throw new ArgumentException(Environment.GetResourceString("Argument_InvalidImpersonationToken")); if (isImpersonating) { if (!Win32Native.DuplicateHandle(Win32Native.GetCurrentProcess(), safeTokenHandle, Win32Native.GetCurrentProcess(), ref m_safeTokenHandle, 0, true, Win32Native.DUPLICATE_SAME_ACCESS)) throw new SecurityException(Win32Native.GetMessage(Marshal.GetLastWin32Error())); m_wi = wi; } m_fsd = fsd; } } // Revert to previous impersonation (the only public method). public void Undo () { // make this a no-op on Win98 so calling code does not have to special case down-level platforms. if (!WindowsIdentity.RunningOnWin2K) return; int hr = 0; if (m_safeTokenHandle.IsInvalid) { // the thread was not initially impersonating hr = Win32.RevertToSelf(); if (hr < 0) throw new SecurityException(Win32Native.GetMessage(hr)); } else { hr = Win32.RevertToSelf(); if (hr < 0) throw new SecurityException(Win32Native.GetMessage(hr)); hr = Win32.ImpersonateLoggedOnUser(m_safeTokenHandle); if (hr < 0) throw new SecurityException(Win32Native.GetMessage(hr)); } WindowsIdentity.UpdateThreadWI(m_wi); if (m_fsd != null) m_fsd.SetTokenHandles(null, null); } // Non-throwing version that does not new any exception objects. To be called when reliability matters [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] internal bool UndoNoThrow() { bool bRet = false; try{ // make this a no-op on Win98 so calling code does not have to special case down-level platforms. if (!WindowsIdentity.RunningOnWin2K) return true; int hr = 0; if (m_safeTokenHandle.IsInvalid) { // the thread was not initially impersonating hr = Win32.RevertToSelf(); } else { hr = Win32.RevertToSelf(); if (hr >= 0) hr = Win32.ImpersonateLoggedOnUser(m_safeTokenHandle); } bRet = (hr >= 0); if (m_fsd != null) m_fsd.SetTokenHandles(null,null); } catch { bRet = false; } return bRet; } // // IDisposable interface. // [ComVisible(false)] protected virtual void Dispose(bool disposing) { if (disposing) { if (m_safeTokenHandle != null && !m_safeTokenHandle.IsClosed) { Undo(); m_safeTokenHandle.Dispose(); } } } [ComVisible(false)] public void Dispose () { Dispose(true); } } }
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- String.cs
- HostedTransportConfigurationManager.cs
- WindowsGraphicsWrapper.cs
- BaseValidator.cs
- FixedTextPointer.cs
- TableLayout.cs
- followingquery.cs
- TextElementEnumerator.cs
- Expression.DebuggerProxy.cs
- Int16Animation.cs
- EntityStoreSchemaFilterEntry.cs
- NativeMethods.cs
- DispatchWrapper.cs
- DbUpdateCommandTree.cs
- MouseGestureValueSerializer.cs
- MenuAdapter.cs
- UserControl.cs
- InvokeProviderWrapper.cs
- OraclePermissionAttribute.cs
- TextServicesDisplayAttribute.cs
- QilDataSource.cs
- SQLChars.cs
- HttpBufferlessInputStream.cs
- EntityClientCacheKey.cs
- UdpTransportSettings.cs
- ErrorEventArgs.cs
- KeyGestureConverter.cs
- LinqDataSourceDeleteEventArgs.cs
- SettingsSection.cs
- BreakSafeBase.cs
- ProviderBase.cs
- ZipIOExtraField.cs
- CacheEntry.cs
- SQLBinary.cs
- KerberosRequestorSecurityToken.cs
- Positioning.cs
- CompensationToken.cs
- NotImplementedException.cs
- GridViewSortEventArgs.cs
- SchemaNamespaceManager.cs
- FileChangeNotifier.cs
- ChangeProcessor.cs
- DrawingContext.cs
- DiagnosticEventProvider.cs
- XmlAggregates.cs
- ScriptModule.cs
- PixelFormat.cs
- ClassValidator.cs
- SQLBinary.cs
- PseudoWebRequest.cs
- SqlUDTStorage.cs
- Effect.cs
- RequestSecurityTokenForGetBrowserToken.cs
- WebBrowserBase.cs
- LicenseManager.cs
- FormsAuthenticationConfiguration.cs
- MergeLocalizationDirectives.cs
- Converter.cs
- LoginCancelEventArgs.cs
- KeyedCollection.cs
- DbUpdateCommandTree.cs
- ContentTextAutomationPeer.cs
- PaperSource.cs
- Stream.cs
- AvTrace.cs
- documentation.cs
- UnmanagedMemoryAccessor.cs
- SqlRemoveConstantOrderBy.cs
- DataViewListener.cs
- EntityProviderServices.cs
- xmlsaver.cs
- CachedTypeface.cs
- GlobalizationAssembly.cs
- XmlReflectionMember.cs
- TextParagraphCache.cs
- DefaultShape.cs
- HeaderCollection.cs
- cookie.cs
- ListComponentEditorPage.cs
- HelpKeywordAttribute.cs
- GridViewRowCollection.cs
- ToolStripDesignerAvailabilityAttribute.cs
- Currency.cs
- ScrollItemProviderWrapper.cs
- NativeRecognizer.cs
- GridViewEditEventArgs.cs
- AtomServiceDocumentSerializer.cs
- DrawTreeNodeEventArgs.cs
- BindingValueChangedEventArgs.cs
- PartitionerStatic.cs
- KeyedCollection.cs
- CompilerInfo.cs
- ContractNamespaceAttribute.cs
- RelationshipEndMember.cs
- XmlLanguageConverter.cs
- RoutedCommand.cs
- TagMapInfo.cs
- Metadata.cs
- FileDetails.cs
- DataObjectSettingDataEventArgs.cs