Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / untmp / whidbey / QFE / ndp / clr / src / BCL / System / Security / Principal / WindowsImpersonationContext.cs / 2 / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TextSyndicationContentKindHelper.cs
- SequentialWorkflowRootDesigner.cs
- XmlSchemaIdentityConstraint.cs
- KeyPressEvent.cs
- ListControlStringCollectionEditor.cs
- HorizontalAlignConverter.cs
- SR.cs
- ToolStripContainer.cs
- Aggregates.cs
- ListItemCollection.cs
- CommandPlan.cs
- DropSource.cs
- ActiveXHelper.cs
- ComponentSerializationService.cs
- ContextStaticAttribute.cs
- Axis.cs
- XmlComment.cs
- KeyPressEvent.cs
- UrlMappingsModule.cs
- WaveHeader.cs
- RedBlackList.cs
- CaseStatement.cs
- updatecommandorderer.cs
- TypeExtensionConverter.cs
- WebHostScriptMappingsInstallComponent.cs
- DataGridViewHeaderCell.cs
- Validator.cs
- RequestCacheEntry.cs
- ChtmlFormAdapter.cs
- StandardMenuStripVerb.cs
- InvokeHandlers.cs
- DefaultEvaluationContext.cs
- VersionPair.cs
- LabelAutomationPeer.cs
- PageContentCollection.cs
- NameTable.cs
- SafeRightsManagementQueryHandle.cs
- SvcMapFile.cs
- AdapterDictionary.cs
- ActivityStateRecord.cs
- _LoggingObject.cs
- GPRECT.cs
- ReflectionHelper.cs
- ScriptBehaviorDescriptor.cs
- TreeNode.cs
- WmfPlaceableFileHeader.cs
- WebPartAuthorizationEventArgs.cs
- ResourceReferenceKeyNotFoundException.cs
- DbModificationClause.cs
- SessionIDManager.cs
- IntegerValidator.cs
- HideDisabledControlAdapter.cs
- RoleServiceManager.cs
- SQLBoolean.cs
- CodeNamespaceImport.cs
- ToolStripPanelCell.cs
- RecordManager.cs
- SchemaTypeEmitter.cs
- UnsafeNativeMethods.cs
- WebEvents.cs
- ClientFormsIdentity.cs
- KeyValueConfigurationElement.cs
- HostingEnvironmentException.cs
- OdbcDataAdapter.cs
- EmptyEnumerable.cs
- GroupLabel.cs
- XmlParser.cs
- ObjectDataSource.cs
- PreDigestedSignedInfo.cs
- PropertyTabAttribute.cs
- PermissionSet.cs
- EventLogPermissionEntryCollection.cs
- DefaultPrintController.cs
- LookupBindingPropertiesAttribute.cs
- ConfigurationErrorsException.cs
- ReaderWriterLockWrapper.cs
- SafeBitVector32.cs
- SessionState.cs
- Assert.cs
- ValidatorCollection.cs
- ToolStripItem.cs
- COM2Enum.cs
- LayoutDump.cs
- dbenumerator.cs
- DataTableMappingCollection.cs
- OracleBFile.cs
- HttpCookie.cs
- ContextProperty.cs
- HttpServerVarsCollection.cs
- TableRow.cs
- SerTrace.cs
- DefaultBindingPropertyAttribute.cs
- TableRowCollection.cs
- RepeaterCommandEventArgs.cs
- SerializationInfo.cs
- ContentPosition.cs
- ScrollViewerAutomationPeer.cs
- CustomAttributeFormatException.cs
- DataServiceExpressionVisitor.cs
- dbenumerator.cs