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
- OracleParameterBinding.cs
- AdRotatorDesigner.cs
- WebPartConnectionCollection.cs
- EntityTypeEmitter.cs
- HandoffBehavior.cs
- HtmlImage.cs
- DependentList.cs
- DictionaryChange.cs
- ResourceReader.cs
- AccessedThroughPropertyAttribute.cs
- ToolStripSeparator.cs
- ListViewItem.cs
- ThreadPool.cs
- ContextMenu.cs
- DataTrigger.cs
- ObjectFullSpanRewriter.cs
- CommonRemoteMemoryBlock.cs
- ScrollProperties.cs
- MediaContextNotificationWindow.cs
- TargetControlTypeCache.cs
- SecurityElementBase.cs
- PageAsyncTask.cs
- RichTextBoxConstants.cs
- RemoveStoryboard.cs
- NamespaceCollection.cs
- Viewport2DVisual3D.cs
- ThreadStartException.cs
- HelpEvent.cs
- BinaryMethodMessage.cs
- OperatorExpressions.cs
- Composition.cs
- TemplateBuilder.cs
- tabpagecollectioneditor.cs
- DataGridViewElement.cs
- ResourceDisplayNameAttribute.cs
- WebPartDisplayMode.cs
- FormClosedEvent.cs
- TaskHelper.cs
- ArgumentOutOfRangeException.cs
- SystemResources.cs
- ReceiveActivity.cs
- SafeReversePInvokeHandle.cs
- VersionPair.cs
- VisemeEventArgs.cs
- DataGridViewCellMouseEventArgs.cs
- StdValidatorsAndConverters.cs
- Hashtable.cs
- WaitHandle.cs
- Internal.cs
- TabControlEvent.cs
- GlobalizationSection.cs
- EnumerableRowCollectionExtensions.cs
- UserValidatedEventArgs.cs
- BoundField.cs
- JsonClassDataContract.cs
- CompressionTransform.cs
- WmlListAdapter.cs
- PriorityRange.cs
- odbcmetadatacolumnnames.cs
- filewebrequest.cs
- OLEDB_Enum.cs
- XmlIgnoreAttribute.cs
- SeparatorAutomationPeer.cs
- Helper.cs
- EmptyEnumerator.cs
- OdbcError.cs
- XmlSchemaValidator.cs
- Graph.cs
- DbReferenceCollection.cs
- XslNumber.cs
- TraceContextEventArgs.cs
- ValidatingCollection.cs
- SpellerStatusTable.cs
- MessageEventSubscriptionService.cs
- XmlSchemaDocumentation.cs
- LinearGradientBrush.cs
- EditorPartChrome.cs
- WebCategoryAttribute.cs
- UTF8Encoding.cs
- RequestCache.cs
- ToolStripContentPanelRenderEventArgs.cs
- SoapClientProtocol.cs
- _SecureChannel.cs
- ColumnHeaderConverter.cs
- CollaborationHelperFunctions.cs
- XmlTextReader.cs
- DataSourceControl.cs
- DataGridViewCellValueEventArgs.cs
- ClassHandlersStore.cs
- DataGridViewTextBoxCell.cs
- MouseGestureValueSerializer.cs
- DesignerActionPropertyItem.cs
- NotImplementedException.cs
- DataGridViewRowCollection.cs
- ResXResourceSet.cs
- ShaperBuffers.cs
- RectAnimation.cs
- PrimitiveXmlSerializers.cs
- TraceLevelStore.cs
- VectorAnimationUsingKeyFrames.cs