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
- CapabilitiesAssignment.cs
- OpCellTreeNode.cs
- ModuleElement.cs
- SynchronizingStream.cs
- PolicyUnit.cs
- WebReferenceCollection.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- RelationalExpressions.cs
- ContentPropertyAttribute.cs
- DataGridViewRowErrorTextNeededEventArgs.cs
- QilGenerator.cs
- ReadOnlyTernaryTree.cs
- NullableFloatAverageAggregationOperator.cs
- Registry.cs
- InputLanguageEventArgs.cs
- FolderNameEditor.cs
- FullTextLine.cs
- DiagnosticsConfigurationHandler.cs
- MemoryStream.cs
- XmlUtf8RawTextWriter.cs
- CompilerError.cs
- SharedPerformanceCounter.cs
- CodeNamespaceCollection.cs
- RelationshipEndMember.cs
- RegexBoyerMoore.cs
- SystemColorTracker.cs
- Internal.cs
- JournalEntry.cs
- ParallelSeparator.xaml.cs
- CustomValidator.cs
- ObjectCloneHelper.cs
- XmlMembersMapping.cs
- DataControlField.cs
- ContentPlaceHolder.cs
- LayoutEngine.cs
- ErrorFormatterPage.cs
- DispatchWrapper.cs
- StrongNameMembershipCondition.cs
- EntityException.cs
- XmlSchemaSimpleTypeRestriction.cs
- RemoteCryptoRsaServiceProvider.cs
- DiscoveryProxy.cs
- Schedule.cs
- OdbcStatementHandle.cs
- ZipIOCentralDirectoryFileHeader.cs
- DecoderReplacementFallback.cs
- CategoryAttribute.cs
- Win32SafeHandles.cs
- ExeConfigurationFileMap.cs
- DecoderFallbackWithFailureFlag.cs
- GridItemPatternIdentifiers.cs
- SelectedPathEditor.cs
- CollectionChangeEventArgs.cs
- BatchServiceHost.cs
- HttpsHostedTransportConfiguration.cs
- HttpResponseInternalWrapper.cs
- FunctionUpdateCommand.cs
- BamlRecordHelper.cs
- HierarchicalDataBoundControl.cs
- DrawingAttributeSerializer.cs
- RowTypePropertyElement.cs
- PropertyFilter.cs
- WmlLiteralTextAdapter.cs
- UserNamePasswordServiceCredential.cs
- URLMembershipCondition.cs
- EncryptedXml.cs
- FormatterServices.cs
- ResourcesChangeInfo.cs
- FormsAuthenticationEventArgs.cs
- InputScopeNameConverter.cs
- FileRecordSequence.cs
- httpserverutility.cs
- SqlParameterCollection.cs
- CachingHintValidation.cs
- DataGridViewColumnConverter.cs
- Rotation3D.cs
- DocumentSequence.cs
- ExpandCollapsePattern.cs
- CodeIterationStatement.cs
- SelectionProviderWrapper.cs
- wgx_sdk_version.cs
- ModelVisual3D.cs
- ToolBar.cs
- _NativeSSPI.cs
- AvTraceDetails.cs
- Sentence.cs
- InstanceOwnerException.cs
- TrackPointCollection.cs
- TriggerActionCollection.cs
- StrokeNodeOperations.cs
- Timer.cs
- LinkedList.cs
- CollectionMarkupSerializer.cs
- XmlMapping.cs
- BrowserTree.cs
- LinkLabelLinkClickedEvent.cs
- NullExtension.cs
- ProxyManager.cs
- WsrmTraceRecord.cs
- ErrorWebPart.cs