Code:
/ DotNET / DotNET / 8.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
- IISUnsafeMethods.cs
- OdbcException.cs
- MsmqHostedTransportConfiguration.cs
- CultureTableRecord.cs
- ConnectionPointConverter.cs
- HttpStreamMessageEncoderFactory.cs
- MenuItemAutomationPeer.cs
- CellPartitioner.cs
- EntityDataSourceWrapper.cs
- VerticalAlignConverter.cs
- CrossContextChannel.cs
- MeasureData.cs
- NotFiniteNumberException.cs
- RC2.cs
- TypeGeneratedEventArgs.cs
- DbConnectionInternal.cs
- SqlTriggerAttribute.cs
- NameValuePair.cs
- Point3D.cs
- ApplicationId.cs
- DependencyObjectProvider.cs
- EmbeddedObject.cs
- ScrollEvent.cs
- FlowDocumentPaginator.cs
- DbConnectionPoolGroupProviderInfo.cs
- CategoryAttribute.cs
- AutomationEvent.cs
- ScrollContentPresenter.cs
- UInt16Converter.cs
- DSASignatureFormatter.cs
- DataMemberFieldConverter.cs
- XamlToRtfParser.cs
- GeneralTransform3D.cs
- SystemIcmpV6Statistics.cs
- OptimalTextSource.cs
- ButtonBase.cs
- XmlNotation.cs
- SettingsPropertyValueCollection.cs
- CriticalExceptions.cs
- Button.cs
- DataFormats.cs
- RtType.cs
- HttpHeaderCollection.cs
- HttpModuleCollection.cs
- odbcmetadatafactory.cs
- Assert.cs
- VisualProxy.cs
- FixedSOMPageElement.cs
- MarkupExtensionReturnTypeAttribute.cs
- RotateTransform.cs
- HostingPreferredMapPath.cs
- Rules.cs
- ObjectPersistData.cs
- RequestTimeoutManager.cs
- XsltOutput.cs
- VersionedStream.cs
- GradientBrush.cs
- XNodeNavigator.cs
- ToolStripPanelCell.cs
- ExpressionLexer.cs
- XPathSelfQuery.cs
- OdbcCommand.cs
- exports.cs
- EntitySqlQueryCacheEntry.cs
- FileNameEditor.cs
- DataSourceControlBuilder.cs
- ProcessInputEventArgs.cs
- PopupEventArgs.cs
- Literal.cs
- JsonByteArrayDataContract.cs
- ActivityMarkupSerializationProvider.cs
- PropertyGridDesigner.cs
- ToolStripItemRenderEventArgs.cs
- TypeTypeConverter.cs
- EndPoint.cs
- XmlSchemaAttributeGroupRef.cs
- Shape.cs
- ObjectDataSourceMethodEditor.cs
- Selection.cs
- HostingPreferredMapPath.cs
- Visual3D.cs
- ToolStripOverflow.cs
- WebPartConnectionsConfigureVerb.cs
- ObjectReferenceStack.cs
- ItemContainerPattern.cs
- TableLayoutPanel.cs
- HwndHost.cs
- ContextMenuAutomationPeer.cs
- XmlSchemaImporter.cs
- MetadataItem.cs
- Glyph.cs
- PackageFilter.cs
- ParsedAttributeCollection.cs
- LocalIdCollection.cs
- CompositeScriptReferenceEventArgs.cs
- Rotation3DAnimationBase.cs
- MembershipPasswordException.cs
- _HeaderInfo.cs
- PermissionSetEnumerator.cs
- EntityContainerEntitySetDefiningQuery.cs