System.Security.Principal.WindowsImpersonation
From: Chet Borg (borgc_at_polarfab.com)
Date: 07/28/03
- Next message: Miha Pihler: "Re: Assigning Certificates"
- Previous message: Joe Kaplan \(MVP - ADSI\): "How to get KeyUsage field given .NET X509Certificate instance?"
- Next in thread: Shel Blauman [MSFT]: "Re: System.Security.Principal.WindowsImpersonation"
- Reply: Shel Blauman [MSFT]: "Re: System.Security.Principal.WindowsImpersonation"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] [ attachment ]
Date: Mon, 28 Jul 2003 14:11:51 -0700
I am writing a application in VB.net which automatically
updates applications on our network. I have everything
working except for registering updated dlls for the vb6
programs on Windows XP workstations (due to the security
settings in Windows XP, non priv users are not allowed to
register dlls) - according to our NT Admin. A colleague
suggested that I use Impersonation, to temporarily
imperonate a priv user.
When I impersonate the user, the new username is
returned - however I do not gain the rights associated
with this new user. I was originally using the Win API
DuplicateToken() but switched to the DuplicateTokenEx(),
after some research on the web.
The code I use for the the function follows.
Any assistance would be appreciated.
Public Function ImpersonateUserAndRegDLLs(ByVal
MyDLLs As c_DLLs) As String
Dim sName As String
Dim token As New IntPtr(0)
Dim TokenCopy As New IntPtr(0)
Dim iLogResult As Integer
Dim newPrincipal As
System.Security.Principal.WindowsPrincipal
Const SecurityImpersonation As Integer =
System.Management.ImpersonationLevel.Impersonate
Dim DLL As c_DLL
Dim TokenAttributes As New SECURITY_ATTRIBUTES
Try
'Logs On the User to the Domain
iLogResult = LogonUser(USERNAME,
Environment.UserDomainName, PWD, LOGON32_LOGON_NETWORK,
LOGON32_PROVIDER_WINNT50, token)
'Gets name of current user
sName =
System.Security.Principal.WindowsIdentity.GetCurrent
().Name
'Create a copy of the Token you are trying to
impersonate
'Dim retVal As Boolean = DuplicateToken
(token, SecurityImpersonation, TokenCopy)
Dim iDupResult As Integer = DuplicateTokenEx
(token, MAXIMUM_ALLOWED, TokenAttributes,
SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation,
TOKEN_TYPE.TokenPrimary, TokenCopy)
sName =
System.Security.Principal.WindowsIdentity.GetCurrent
().Name
'Tests if DuplicateToken works
If iDupResult = 0 Or iLogResult = 0 Then
CloseHandle(token)
frm.lstFileHist.Items.Add("Error --
Logging on BuildXP")
Else
'Creates a new Windows Identity
Dim NewId As New
System.Security.Principal.WindowsIdentity(TokenCopy)
'Performs the impersonation
Dim ImpersonatedUser As
System.Security.Principal.WindowsImpersonationContext =
NewId.Impersonate
'Used to Chk impersonation worked
sName =
System.Security.Principal.WindowsIdentity.GetCurrent
().Name
'Creates a Windows Principal based in the
New Identity
'Used to check if the Users privs were
impersonated also
newPrincipal = New
System.Security.Principal.WindowsPrincipal(NewId)
'Loops through all DLLs and Registers Them
'Regular User is not a member of
Group "Domain Admins", after the impersonation this
should be returned a true
MessageBox.Show("The user is a member of
Domain Admins: " & newPrincipal.IsInRole("Domain
Admins").ToString)
MessageBox.Show("User is " & sName)
MessageBox.Show("Token: " &
System.Security.Principal.WindowsIdentity.GetCurrent
().Token.ToString)
'** impersonation works, but the
impersonated user doesn't get any of the
'** rights of the user it is
impersonating, so it is unable to register the DLLs.
For Each DLL In MyDLLs
frm.lstFileHist.Items.Add("Attempting
to Register - " & DLL.FileName)
Dim sResult As String
'Next Line uses the Shell function to
execute a regsvr32 cmd
sResult = DLL.RegisterDLL()
If sResult = "TRUE" Then
frm.lstFileHist.Items.Add
("Successfully Executed Regsvr32 for - " & DLL.FileName)
Else
frm.lstFileHist.Items.Add(sResult)
End If
Next
'Stop Impersonation
ImpersonatedUser.Undo()
'Used to Chk impersonation.undo worked
sName =
System.Security.Principal.WindowsIdentity.GetCurrent
().Name
MessageBox.Show("User is " & sName)
MessageBox.Show("Token: " &
System.Security.Principal.WindowsIdentity.GetCurrent
().Token.ToString)
End If
Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
If Not System.IntPtr.op_Equality(token,
IntPtr.Zero) Then
CloseHandle(token)
End If
If Not System.IntPtr.op_Equality(TokenCopy,
IntPtr.Zero) Then
CloseHandle(TokenCopy)
End If
End Try
End Function
- Next message: Miha Pihler: "Re: Assigning Certificates"
- Previous message: Joe Kaplan \(MVP - ADSI\): "How to get KeyUsage field given .NET X509Certificate instance?"
- Next in thread: Shel Blauman [MSFT]: "Re: System.Security.Principal.WindowsImpersonation"
- Reply: Shel Blauman [MSFT]: "Re: System.Security.Principal.WindowsImpersonation"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] [ attachment ]
Relevant Pages
|