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
- OracleConnectionFactory.cs
- InputReferenceExpression.cs
- XMLDiffLoader.cs
- sqlnorm.cs
- DbReferenceCollection.cs
- BitmapEffectInput.cs
- TransactedBatchingBehavior.cs
- PnrpPermission.cs
- DisplayInformation.cs
- SplitterEvent.cs
- adornercollection.cs
- HostTimeoutsElement.cs
- DirectoryRedirect.cs
- DllNotFoundException.cs
- PropertyConverter.cs
- PropertyPathConverter.cs
- JsonReader.cs
- Span.cs
- ColumnTypeConverter.cs
- CustomPopupPlacement.cs
- PasswordPropertyTextAttribute.cs
- XmlNavigatorFilter.cs
- SoapSchemaExporter.cs
- ReferenceService.cs
- StringUtil.cs
- TwoPhaseCommit.cs
- PageParserFilter.cs
- DataGridViewSelectedCellsAccessibleObject.cs
- GifBitmapEncoder.cs
- DefaultValueMapping.cs
- ServiceReference.cs
- TextViewSelectionProcessor.cs
- SettingsSavedEventArgs.cs
- Cursors.cs
- ZoneLinkButton.cs
- FaultHandlingFilter.cs
- XmlEncodedRawTextWriter.cs
- PrintController.cs
- CodeGeneratorOptions.cs
- GroupItem.cs
- XmlQuerySequence.cs
- DrawingVisualDrawingContext.cs
- TableRowGroup.cs
- SelectManyQueryOperator.cs
- ConfigurationSectionGroupCollection.cs
- DetailsViewAutoFormat.cs
- AsyncStreamReader.cs
- EllipticalNodeOperations.cs
- DocumentPageHost.cs
- ExpressionEditorAttribute.cs
- ProgramPublisher.cs
- KnownIds.cs
- TableSectionStyle.cs
- Boolean.cs
- Application.cs
- TextCompositionManager.cs
- D3DImage.cs
- EmissiveMaterial.cs
- SQLInt64.cs
- ArrayList.cs
- SequentialUshortCollection.cs
- Codec.cs
- precedingsibling.cs
- connectionpool.cs
- MarginCollapsingState.cs
- Wildcard.cs
- EdmValidator.cs
- CssStyleCollection.cs
- DesignerActionUIService.cs
- WorkflowViewService.cs
- CodePropertyReferenceExpression.cs
- GlobalAclOperationRequirement.cs
- XmlnsCache.cs
- RightsManagementInformation.cs
- BaseCollection.cs
- ServiceHttpModule.cs
- WindowsToolbarItemAsMenuItem.cs
- DataRelationCollection.cs
- ConfigurationLocationCollection.cs
- WorkflowApplication.cs
- CopyCodeAction.cs
- WinEventQueueItem.cs
- RuntimeCompatibilityAttribute.cs
- ListViewGroupConverter.cs
- SqlStatistics.cs
- CrossContextChannel.cs
- ObjectItemCollectionAssemblyCacheEntry.cs
- ErrorWebPart.cs
- OdbcPermission.cs
- DeviceContext.cs
- ComponentRenameEvent.cs
- DependencyPropertyHelper.cs
- Ipv6Element.cs
- EllipticalNodeOperations.cs
- AnimationClockResource.cs
- sqlser.cs
- ExitEventArgs.cs
- CaseCqlBlock.cs
- Vector3DValueSerializer.cs
- InternalConfigConfigurationFactory.cs