Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / 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); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- smtppermission.cs
- DesignerRegion.cs
- TableLayoutRowStyleCollection.cs
- BaseDataList.cs
- CollectionViewSource.cs
- DataGridViewDesigner.cs
- CqlGenerator.cs
- EmbeddedMailObject.cs
- GeneralTransformGroup.cs
- TypeConverterAttribute.cs
- AnnotationMap.cs
- WorkflowView.cs
- WpfPayload.cs
- _ReceiveMessageOverlappedAsyncResult.cs
- ProxyWebPart.cs
- DataGridViewCellPaintingEventArgs.cs
- ObjectHandle.cs
- VisualCollection.cs
- Events.cs
- SqlParameter.cs
- columnmapfactory.cs
- CategoryNameCollection.cs
- SupportingTokenBindingElement.cs
- DocumentReference.cs
- WsatProxy.cs
- IndexedEnumerable.cs
- ExpandSegmentCollection.cs
- Int64AnimationUsingKeyFrames.cs
- AsymmetricKeyExchangeDeformatter.cs
- HostedBindingBehavior.cs
- ActiveDocumentEvent.cs
- StickyNoteContentControl.cs
- URLString.cs
- StorageAssociationTypeMapping.cs
- RtfToXamlReader.cs
- CodeVariableDeclarationStatement.cs
- AtomMaterializer.cs
- LoadRetryAsyncResult.cs
- TabPanel.cs
- WCFBuildProvider.cs
- ValueTypeIndexerReference.cs
- ToolStripSettings.cs
- TextServicesCompartmentContext.cs
- HtmlTextArea.cs
- FixedPageAutomationPeer.cs
- WebPartCatalogCloseVerb.cs
- DataGridViewCellValueEventArgs.cs
- PtsHelper.cs
- Margins.cs
- ErrorHandlerModule.cs
- TabControl.cs
- StringComparer.cs
- GeometryModel3D.cs
- SmtpCommands.cs
- Typeface.cs
- InvalidDataContractException.cs
- Substitution.cs
- DefaultMemberAttribute.cs
- ToolStripContainerActionList.cs
- DirtyTextRange.cs
- IconEditor.cs
- HtmlInputControl.cs
- Comparer.cs
- CookieHandler.cs
- UrlSyndicationContent.cs
- EntityDataSourceWrapperCollection.cs
- XPathNode.cs
- SymLanguageVendor.cs
- XmlDictionaryWriter.cs
- WebHttpDispatchOperationSelectorData.cs
- FileSystemInfo.cs
- BitmapEffectGroup.cs
- HttpCapabilitiesSectionHandler.cs
- CancelRequestedQuery.cs
- ModifiableIteratorCollection.cs
- GeometryHitTestResult.cs
- CounterSetInstanceCounterDataSet.cs
- TryCatchDesigner.xaml.cs
- FailedToStartupUIException.cs
- VerticalAlignConverter.cs
- WorkItem.cs
- DataGridViewCellStyleConverter.cs
- SqlDataSourceEnumerator.cs
- DBSchemaRow.cs
- ListDictionary.cs
- XmlSchemaAttributeGroup.cs
- BadImageFormatException.cs
- ConfigXmlElement.cs
- FlowLayoutPanel.cs
- StateRuntime.cs
- SemanticAnalyzer.cs
- ComponentDispatcherThread.cs
- ToolStripDropDownDesigner.cs
- StoreAnnotationsMap.cs
- AffineTransform3D.cs
- SmtpReplyReader.cs
- BindingExpressionBase.cs
- GetUserPreferenceRequest.cs
- SQLRoleProvider.cs
- AVElementHelper.cs