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
- UnsafeNativeMethods.cs
- ObjectDataSourceDesigner.cs
- SoapSchemaMember.cs
- RegistrySecurity.cs
- FactorySettingsElement.cs
- RelationshipWrapper.cs
- Timer.cs
- SchemaManager.cs
- CTreeGenerator.cs
- SelectedGridItemChangedEvent.cs
- Nodes.cs
- DbModificationClause.cs
- AssemblyCollection.cs
- AttachedPropertyInfo.cs
- ObjectDataSourceEventArgs.cs
- TabControl.cs
- HeaderedItemsControl.cs
- MembershipAdapter.cs
- DataControlFieldCollection.cs
- WindowHideOrCloseTracker.cs
- DrawingGroup.cs
- NullReferenceException.cs
- ObsoleteAttribute.cs
- UrlAuthorizationModule.cs
- _Connection.cs
- ManagedFilter.cs
- ExceptionHandlerDesigner.cs
- XPathArrayIterator.cs
- SamlAuthorizationDecisionStatement.cs
- HandlerWithFactory.cs
- WebPartsSection.cs
- NativeMethods.cs
- SQLCharsStorage.cs
- FrugalMap.cs
- FieldCollectionEditor.cs
- hebrewshape.cs
- Vector3DKeyFrameCollection.cs
- DetailsViewPagerRow.cs
- assemblycache.cs
- StyleSheetComponentEditor.cs
- TaiwanCalendar.cs
- DataTableExtensions.cs
- ReliableRequestSessionChannel.cs
- JsonReaderWriterFactory.cs
- CancellationToken.cs
- TypeSystem.cs
- DataQuery.cs
- SByte.cs
- ApplicationHost.cs
- RegistrationServices.cs
- KnownTypeAttribute.cs
- SafeProcessHandle.cs
- ConfigurationSection.cs
- InlinedAggregationOperatorEnumerator.cs
- ZoneMembershipCondition.cs
- DetailsViewModeEventArgs.cs
- DuplexSecurityProtocolFactory.cs
- OrderedDictionaryStateHelper.cs
- ThreadExceptionDialog.cs
- TextDocumentView.cs
- Crc32.cs
- PerspectiveCamera.cs
- ObjectDataSourceEventArgs.cs
- FlowDocumentView.cs
- FilteredDataSetHelper.cs
- AddDataControlFieldDialog.cs
- EventListenerClientSide.cs
- SystemGatewayIPAddressInformation.cs
- TreeChangeInfo.cs
- StorageRoot.cs
- FrameworkContentElement.cs
- Decoder.cs
- XmlSchemaObject.cs
- RevocationPoint.cs
- GridViewCommandEventArgs.cs
- ArraySortHelper.cs
- CollectionViewSource.cs
- BrushConverter.cs
- DragEvent.cs
- PageHandlerFactory.cs
- InternalConfigEventArgs.cs
- LoadItemsEventArgs.cs
- SessionParameter.cs
- XPathAncestorQuery.cs
- PlainXmlDeserializer.cs
- TypeSystemHelpers.cs
- SqlCommandSet.cs
- BuildProviderAppliesToAttribute.cs
- AutomationElementCollection.cs
- ParameterToken.cs
- FileEnumerator.cs
- OleServicesContext.cs
- PersistencePipeline.cs
- JsonFormatGeneratorStatics.cs
- PriorityItem.cs
- OleDbTransaction.cs
- RuleValidation.cs
- WindowProviderWrapper.cs
- XmlSchemaChoice.cs
- GenerateTemporaryTargetAssembly.cs