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
- ActivationServices.cs
- TemplateKey.cs
- TypeSystem.cs
- CompilerGlobalScopeAttribute.cs
- ChineseLunisolarCalendar.cs
- PageAsyncTaskManager.cs
- XmlILTrace.cs
- UnknownBitmapEncoder.cs
- HttpHandlersSection.cs
- LongPath.cs
- NavigatorInput.cs
- ProviderUtil.cs
- EpmCustomContentWriterNodeData.cs
- PagesChangedEventArgs.cs
- UnionCodeGroup.cs
- CodeTypeParameter.cs
- NopReturnReader.cs
- TypeDelegator.cs
- ListViewInsertEventArgs.cs
- BaseCodeDomTreeGenerator.cs
- PostBackTrigger.cs
- RelationshipEndCollection.cs
- ConfigurationValues.cs
- SmtpDigestAuthenticationModule.cs
- DesignerDataColumn.cs
- WindowsAuthenticationModule.cs
- XmlCharCheckingReader.cs
- Marshal.cs
- BoundsDrawingContextWalker.cs
- ISAPIApplicationHost.cs
- FormatterServices.cs
- WindowsListViewScroll.cs
- Collection.cs
- ProtocolsConfigurationEntry.cs
- DigestTraceRecordHelper.cs
- ImageInfo.cs
- AuthenticationService.cs
- TimeEnumHelper.cs
- TextTabProperties.cs
- SiteMapDataSource.cs
- DoubleLinkListEnumerator.cs
- PropertyDescriptorComparer.cs
- ExpressionLexer.cs
- ExtensionSurface.cs
- ApplicationBuildProvider.cs
- DesignerHelpers.cs
- RegistryHandle.cs
- DependencyPropertyKind.cs
- TextElementCollection.cs
- TdsParserStateObject.cs
- CompositeControlDesigner.cs
- DrawingContextWalker.cs
- CodePageEncoding.cs
- AppDomain.cs
- EdmRelationshipNavigationPropertyAttribute.cs
- RecommendedAsConfigurableAttribute.cs
- ImageListImageEditor.cs
- Positioning.cs
- Point4D.cs
- TextWriter.cs
- FragmentQuery.cs
- ConfigXmlAttribute.cs
- SecurityTokenTypes.cs
- ArrayConverter.cs
- IPipelineRuntime.cs
- TypeSystemHelpers.cs
- XmlUtilWriter.cs
- XmlILConstructAnalyzer.cs
- BufferCache.cs
- ISFClipboardData.cs
- NativeCppClassAttribute.cs
- ServiceDiscoveryBehavior.cs
- HttpDigestClientCredential.cs
- ComponentChangedEvent.cs
- GenericPrincipal.cs
- JsonFormatGeneratorStatics.cs
- HtmlInputPassword.cs
- X509CertificateClaimSet.cs
- EventListener.cs
- SerializerDescriptor.cs
- InvalidDocumentContentsException.cs
- ImageListDesigner.cs
- Byte.cs
- ProgressiveCrcCalculatingStream.cs
- OleDbConnectionPoolGroupProviderInfo.cs
- UInt32Storage.cs
- regiisutil.cs
- ScalarConstant.cs
- LayoutTable.cs
- FontUnit.cs
- SchemaObjectWriter.cs
- InnerItemCollectionView.cs
- CheckBoxField.cs
- HttpServerProtocol.cs
- Privilege.cs
- InkCanvasAutomationPeer.cs
- SubMenuStyleCollection.cs
- ResetableIterator.cs
- SecurityTokenValidationException.cs
- WindowsScroll.cs