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
- SystemMulticastIPAddressInformation.cs
- BooleanExpr.cs
- Group.cs
- QuadraticEase.cs
- CompositeKey.cs
- TypedElement.cs
- UnitySerializationHolder.cs
- SendMailErrorEventArgs.cs
- DataControlField.cs
- FloatSumAggregationOperator.cs
- DragEventArgs.cs
- LoginStatusDesigner.cs
- AdCreatedEventArgs.cs
- PathFigureCollection.cs
- FileDialogCustomPlace.cs
- ProjectionCamera.cs
- BamlLocalizer.cs
- InstanceKeyCompleteException.cs
- FormsAuthenticationCredentials.cs
- DefaultSerializationProviderAttribute.cs
- SafeFreeMibTable.cs
- MenuItemBindingCollection.cs
- HandlerFactoryWrapper.cs
- RowParagraph.cs
- PropertyItemInternal.cs
- DesignerForm.cs
- KeyFrames.cs
- PenThread.cs
- FileStream.cs
- ToolStripComboBox.cs
- SafeEventLogWriteHandle.cs
- DropDownList.cs
- MsmqProcessProtocolHandler.cs
- DataServiceRequestOfT.cs
- BaseCollection.cs
- EventArgs.cs
- RadioButton.cs
- AuthenticationConfig.cs
- SpecialNameAttribute.cs
- SevenBitStream.cs
- ParseHttpDate.cs
- ListDesigner.cs
- XmlBoundElement.cs
- MetadataHelper.cs
- EntityDataSourceWizardForm.cs
- TextBoxRenderer.cs
- AbstractSvcMapFileLoader.cs
- GenerateHelper.cs
- ExpressionHelper.cs
- DSACryptoServiceProvider.cs
- Track.cs
- ProtocolsSection.cs
- PerfCounterSection.cs
- ServiceInfoCollection.cs
- HorizontalAlignConverter.cs
- NegatedConstant.cs
- CatalogPartCollection.cs
- PerformanceCounterPermissionAttribute.cs
- bidPrivateBase.cs
- EllipticalNodeOperations.cs
- HttpClientCertificate.cs
- InvokePattern.cs
- XPathAncestorQuery.cs
- ScriptResourceMapping.cs
- HandlerFactoryWrapper.cs
- ScrollItemPattern.cs
- ExpandCollapsePattern.cs
- XamlInt32CollectionSerializer.cs
- AssociationSet.cs
- SqlDataSourceCache.cs
- OutOfProcStateClientManager.cs
- DbConnectionFactory.cs
- SoapSchemaMember.cs
- TextEncodedRawTextWriter.cs
- XmlElementAttribute.cs
- MonitorWrapper.cs
- ValuePatternIdentifiers.cs
- ADConnectionHelper.cs
- LocatorBase.cs
- _CommandStream.cs
- ExpandCollapseProviderWrapper.cs
- AttributeSetAction.cs
- XmlDownloadManager.cs
- ThrowHelper.cs
- Attributes.cs
- ConstraintConverter.cs
- XamlPointCollectionSerializer.cs
- InvokerUtil.cs
- OutputCacheSection.cs
- GenericAuthenticationEventArgs.cs
- MethodToken.cs
- ContainerFilterService.cs
- PopOutPanel.cs
- ZipIOLocalFileDataDescriptor.cs
- SecurityDescriptor.cs
- ChannelManager.cs
- SemanticResultKey.cs
- SqlCachedBuffer.cs
- CodeTryCatchFinallyStatement.cs
- XmlSchemaAttributeGroupRef.cs