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
- RealProxy.cs
- DBSqlParserTable.cs
- DiagnosticsConfiguration.cs
- LinkArea.cs
- WarningException.cs
- PropertyValue.cs
- peernodestatemanager.cs
- PersistenceTypeAttribute.cs
- CurrentChangingEventManager.cs
- FieldAccessException.cs
- TreeBuilder.cs
- SynchronizationLockException.cs
- Axis.cs
- FileLogRecordStream.cs
- CodePropertyReferenceExpression.cs
- ClassHandlersStore.cs
- AutomationProperties.cs
- QueryLifecycle.cs
- UserControlAutomationPeer.cs
- TraceContext.cs
- EventWaitHandle.cs
- EntityDataSourceWizardForm.cs
- ConnectionManagementElement.cs
- MediaElement.cs
- FunctionDefinition.cs
- Geometry3D.cs
- TextEditorDragDrop.cs
- Point.cs
- PointCollectionConverter.cs
- ConfigXmlWhitespace.cs
- HMAC.cs
- BackgroundFormatInfo.cs
- WebExceptionStatus.cs
- EntityDataSourceViewSchema.cs
- EventBuilder.cs
- BaseServiceProvider.cs
- LayoutInformation.cs
- SignedInfo.cs
- DocumentXPathNavigator.cs
- WarningException.cs
- DictionaryTraceRecord.cs
- WebControlAdapter.cs
- XhtmlBasicTextBoxAdapter.cs
- BCryptNative.cs
- DataQuery.cs
- DBDataPermission.cs
- Accessible.cs
- SafeTokenHandle.cs
- ToolStripProgressBar.cs
- IntegerCollectionEditor.cs
- _FtpControlStream.cs
- RubberbandSelector.cs
- IndexedString.cs
- Drawing.cs
- Size.cs
- ItemCollectionEditor.cs
- KeyEventArgs.cs
- BatchStream.cs
- ConstraintManager.cs
- AudienceUriMode.cs
- BindStream.cs
- LinearGradientBrush.cs
- CounterCreationDataConverter.cs
- Effect.cs
- DataListItem.cs
- TableDetailsRow.cs
- CursorInteropHelper.cs
- RepeaterCommandEventArgs.cs
- WindowsBrush.cs
- ItemAutomationPeer.cs
- BindingContext.cs
- SqlDataSourceEnumerator.cs
- DrawingCollection.cs
- StylusEditingBehavior.cs
- ImageListImage.cs
- IISMapPath.cs
- TemplatedWizardStep.cs
- WpfWebRequestHelper.cs
- CatalogZone.cs
- FacetValueContainer.cs
- XPathSingletonIterator.cs
- SqlDependencyUtils.cs
- EventHandlersStore.cs
- XmlReturnReader.cs
- ToolStripDropDownMenu.cs
- nulltextnavigator.cs
- DoubleAnimationUsingKeyFrames.cs
- QueueProcessor.cs
- TextReader.cs
- IISMapPath.cs
- DeferredReference.cs
- DataControlCommands.cs
- NullReferenceException.cs
- ModuleBuilderData.cs
- ReferenceEqualityComparer.cs
- OdbcParameter.cs
- XmlSerializerNamespaces.cs
- _NestedMultipleAsyncResult.cs
- SQLByte.cs
- ArgIterator.cs