Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / clr / src / BCL / System / Security / Principal / WindowsImpersonationContext.cs / 2 / 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); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- InvokePattern.cs
- Debugger.cs
- TextElementCollection.cs
- ConnectionProviderAttribute.cs
- WebResponse.cs
- ObjectTag.cs
- StateInitializationDesigner.cs
- Resources.Designer.cs
- DNS.cs
- cookieexception.cs
- FileRecordSequence.cs
- ExpandableObjectConverter.cs
- XmlSchemaSimpleContentExtension.cs
- CurrentChangedEventManager.cs
- FontConverter.cs
- Transform.cs
- ToolStripContainer.cs
- UmAlQuraCalendar.cs
- PenContexts.cs
- CodeDOMUtility.cs
- login.cs
- FragmentQuery.cs
- FileChangesMonitor.cs
- XmlNodeChangedEventArgs.cs
- SaveFileDialog.cs
- EventProviderTraceListener.cs
- _ConnectOverlappedAsyncResult.cs
- ListViewHitTestInfo.cs
- ClassValidator.cs
- ScrollBar.cs
- SessionPageStatePersister.cs
- PageRequestManager.cs
- QilUnary.cs
- TemplatedAdorner.cs
- SendActivity.cs
- DesignerHelpers.cs
- GraphicsState.cs
- Stream.cs
- LongAverageAggregationOperator.cs
- _TimerThread.cs
- HtmlTableRow.cs
- ConnectionManagementElementCollection.cs
- XmlSchemaExporter.cs
- ApplicationSecurityInfo.cs
- DynamicDataRoute.cs
- SchemaImporterExtensionElementCollection.cs
- ChannelBinding.cs
- _PooledStream.cs
- Thumb.cs
- SpellerError.cs
- CollectionMarkupSerializer.cs
- ControlBindingsCollection.cs
- ButtonPopupAdapter.cs
- DependentList.cs
- ProcessInfo.cs
- ExpressionBuilderContext.cs
- InvariantComparer.cs
- _DisconnectOverlappedAsyncResult.cs
- TextPointer.cs
- DataRowComparer.cs
- MatrixStack.cs
- WsdlInspector.cs
- ParagraphResult.cs
- DocumentPaginator.cs
- FigureParagraph.cs
- LinearKeyFrames.cs
- StructuralObject.cs
- MetadataUtilsSmi.cs
- ErrorInfoXmlDocument.cs
- MediaContextNotificationWindow.cs
- CellTreeNodeVisitors.cs
- WpfPayload.cs
- XPathEmptyIterator.cs
- XPathConvert.cs
- Composition.cs
- ConfigurationProviderException.cs
- IDQuery.cs
- UTF32Encoding.cs
- DiscoveryExceptionDictionary.cs
- InfoCardRSAPKCS1KeyExchangeDeformatter.cs
- _PooledStream.cs
- WindowsScrollBarBits.cs
- TransformConverter.cs
- EditingCoordinator.cs
- RawContentTypeMapper.cs
- odbcmetadatacollectionnames.cs
- ConnectionManagementElementCollection.cs
- ErrorFormatter.cs
- OledbConnectionStringbuilder.cs
- JournalEntry.cs
- XmlCharType.cs
- TextDecoration.cs
- LongMinMaxAggregationOperator.cs
- AssemblyInfo.cs
- LazyTextWriterCreator.cs
- ContextBase.cs
- EventDrivenDesigner.cs
- ImageCollectionCodeDomSerializer.cs
- WebHttpBindingElement.cs
- DifferencingCollection.cs