Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / 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); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- AnimationException.cs
- CodeAccessPermission.cs
- InfoCardRSAOAEPKeyExchangeDeformatter.cs
- ObjectRef.cs
- DeviceSpecificDesigner.cs
- WindowsStartMenu.cs
- DragDeltaEventArgs.cs
- TextSyndicationContent.cs
- RuleSetDialog.Designer.cs
- regiisutil.cs
- ServiceModelConfigurationElementCollection.cs
- SafeRightsManagementEnvironmentHandle.cs
- HttpCookiesSection.cs
- DataContractSerializerOperationBehavior.cs
- SiteMapSection.cs
- RoleBoolean.cs
- OdbcParameter.cs
- RegistryKey.cs
- StretchValidation.cs
- Vector3DCollectionValueSerializer.cs
- DictionarySectionHandler.cs
- Decoder.cs
- DbProviderFactories.cs
- Facet.cs
- Interlocked.cs
- AssociationSetMetadata.cs
- InvokeSchedule.cs
- XmlAttributeOverrides.cs
- UIElementPropertyUndoUnit.cs
- MaskedTextProvider.cs
- JournalEntryStack.cs
- FormViewDeletedEventArgs.cs
- RequestCache.cs
- WebFormsRootDesigner.cs
- ContextInformation.cs
- DeviceContexts.cs
- CodeMemberProperty.cs
- ToolboxControl.cs
- IPeerNeighbor.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- TextRange.cs
- DockPatternIdentifiers.cs
- SvcFileManager.cs
- ping.cs
- InlineCollection.cs
- TextParagraph.cs
- TimeEnumHelper.cs
- SqlUserDefinedAggregateAttribute.cs
- XmlSerializerFactory.cs
- EventToken.cs
- TextFormatterHost.cs
- PreloadedPackages.cs
- Stopwatch.cs
- DbParameterCollection.cs
- RightNameExpirationInfoPair.cs
- TargetControlTypeCache.cs
- Size3D.cs
- SolidColorBrush.cs
- ToolStripItemBehavior.cs
- TextMessageEncodingBindingElement.cs
- PreApplicationStartMethodAttribute.cs
- AddInBase.cs
- ListViewDeletedEventArgs.cs
- SystemGatewayIPAddressInformation.cs
- SingleKeyFrameCollection.cs
- KeyedByTypeCollection.cs
- sqlstateclientmanager.cs
- BrowserTree.cs
- ValidateNames.cs
- EntityChangedParams.cs
- WindowsListViewScroll.cs
- ThemeConfigurationDialog.cs
- ItemsPresenter.cs
- ObjectDataSourceDisposingEventArgs.cs
- SemanticValue.cs
- ResourcePool.cs
- Material.cs
- InputElement.cs
- XdrBuilder.cs
- ValueTypeFixupInfo.cs
- ADMembershipProvider.cs
- bidPrivateBase.cs
- FastEncoderWindow.cs
- MobileDeviceCapabilitiesSectionHandler.cs
- SqlInfoMessageEvent.cs
- BamlBinaryWriter.cs
- Stack.cs
- ValidationEventArgs.cs
- FileClassifier.cs
- WebConfigurationFileMap.cs
- BitmapEffectInput.cs
- Ipv6Element.cs
- httpstaticobjectscollection.cs
- CatalogPartCollection.cs
- InputMethodStateChangeEventArgs.cs
- SelectionEditor.cs
- DocumentOrderQuery.cs
- QuestionEventArgs.cs
- RuntimeTransactionHandle.cs
- DrawingAttributeSerializer.cs