473,416 Members | 1,734 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,416 software developers and data experts.

Run as Administrator, then execute something as the user

I'm writing a little program that will run when a user logs in, checks their
password expiration and also installs a piece of monitoring software if
necessary.
The program has to run on Vista so I got my first experience writing for UAC.

I've worked though the signed manifest and all the other little quirky stuff
I have to do to get my app to run as Administrator (System.DirectoryServices
said it required admin rights) and everything is working just dandy.

But, I would also like to map drives for the user as I do this. Problem is
that when I map the drive using the Admin split token privs, it actually maps
the drive for the admin user, not the lower priv user token. So I see that
it works, it reports that it works, even checking the existence of the drive
letter work but the drive letters don't show for the end user.

Now for the weird $50 question.

Is there a way while my program is running under the Admin token to execute
something as the user? Like open a cmd shell and run a simple net use
command?

I have this code running the mapping. Works great on XP, and works under
Vista but I just don't see the drives as the user on Vista. (comments
removed for space)

Dim myProcess As Process = New Process
myProcess.StartInfo.FileName = "cmd.exe"
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
myProcess.StartInfo.CreateNoWindow = True
myProcess.StartInfo.Arguments = "/C net use K: \\vail\vmdk /persistent:no"
myProcess.Start()
myProcess.WaitForExit(10000)
If System.IO.Directory.Exists(strDrive) Then
txtStatus.Text = txtStatus.Text & "->Success "
Else
txtStatus.Text = txtStatus.Text & "->Failed "
End If
Really hoping that made sense....
Aug 15 '08 #1
4 7048
Hmm $50,-- :-)

I have written a class that can solve this problem , i use this class to
write to a locations where normall users do not have access rights


### CLASS CODE ###
'Michel Posseth [MCP] 10-07-2008 , written to run parts of code in another
user context during runtime

Imports System.Security

Imports System.Security.Principal

Imports System.Runtime.InteropServices

Public Class ImpersonateSpecificUser

Implements IDisposable

Private Const LOGON32_LOGON_INTERACTIVE As Integer = 2

Private Const LOGON32_PROVIDER_DEFAULT As Integer = 0

Private impersonationContext As WindowsImpersonationContext

Declare Function LogonUserA Lib "advapi32.dll" (ByVal lpszUsername As
String, _

ByVal lpszDomain As String, _

ByVal lpszPassword As String, _

ByVal dwLogonType As Integer, _

ByVal dwLogonProvider As Integer, _

ByRef phToken As IntPtr) As Integer

Declare Auto Function DuplicateToken Lib "advapi32.dll" ( _

ByVal ExistingTokenHandle As IntPtr, _

ByVal ImpersonationLevel As Integer, _

ByRef DuplicateTokenHandle As IntPtr) As Integer

Declare Auto Function RevertToSelf Lib "advapi32.dll" () As Long

Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As
IntPtr) As Long

Public Event eSpecificUserImpersonation(ByVal Success As Boolean)

Private _Impersonated As Boolean

''' <summary>

''' Gets or sets a value indicating whether this <see
cref="ImpersonateSpecificUser" /is impersonated.

''' </summary>

''' <value><c>true</cif impersonated; otherwise, <c>false</c>.</value>

Public Property Impersonated() As Boolean

Get

Return _Impersonated

End Get

Private Set(ByVal value As Boolean)

_Impersonated = value

End Set

End Property

''' <summary>

''' Initializes a new instance of the <see cref="ImpersonateSpecificUser" />
class.

''' </summary>

''' <param name="UserName">Name of the user.</param>

''' <param name="Password">The password.</param>

''' <param name="Domain">The domain.</param>

Public Sub New(ByVal UserName As String, ByVal Password As String, ByVal
Domain As String)

If impersonateValidUser(UserName, Domain, Password) Then

RaiseEvent eSpecificUserImpersonation(True)

Else

'Your impersonation failed. Therefore, include a fail-safe mechanism here.

RaiseEvent eSpecificUserImpersonation(False)

End If

End Sub

''' <summary>

''' Impersonates the valid user.

''' </summary>

''' <param name="userName">Name of the user.</param>

''' <param name="domain">The domain.</param>

''' <param name="password">The password.</param>

''' <returns></returns>

Private Function impersonateValidUser(ByVal userName As String, ByVal domain
As String, ByVal password As String) As Boolean

Dim tempWindowsIdentity As WindowsIdentity

Dim token As IntPtr = IntPtr.Zero

Dim tokenDuplicate As IntPtr = IntPtr.Zero

impersonateValidUser = False

If RevertToSelf() Then

If LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, token) <0 Then

If DuplicateToken(token, 2, tokenDuplicate) <0 Then

tempWindowsIdentity = New WindowsIdentity(tokenDuplicate)

impersonationContext = tempWindowsIdentity.Impersonate()

If Not impersonationContext Is Nothing Then

impersonateValidUser = True

End If

End If

End If

End If

If Not tokenDuplicate.Equals(IntPtr.Zero) Then

CloseHandle(tokenDuplicate)

End If

If Not token.Equals(IntPtr.Zero) Then

CloseHandle(token)

End If

End Function

''' <summary>

''' Undoes the impersonation.

''' </summary>

Public Sub undoImpersonation()

impersonationContext.Undo()

Impersonated = False

End Sub

#Region " IDisposable Support "

Private disposedValue As Boolean = False ' To detect redundant calls

' IDisposable

Protected Overridable Sub Dispose(ByVal disposing As Boolean)

If Not Me.disposedValue Then

If disposing Then

' TODO: free other state (managed objects).

End If

If Impersonated Then 'wees er zeer van dat we weer in een normale context
draaien

undoImpersonation()

End If

' TODO: free your own state (unmanaged objects).

' TODO: set large fields to null.

End If

Me.disposedValue = True

End Sub

' This code added by Visual Basic to correctly implement the disposable
pattern.

Public Sub Dispose() Implements IDisposable.Dispose

' Do not change this code. Put cleanup code in Dispose(ByVal disposing As
Boolean) above.

Dispose(True)

GC.SuppressFinalize(Me)

End Sub

#End Region

''' <summary>

''' Impersonates the specific user_e specific user impersonation.

''' </summary>

''' <param name="Success">if set to <c>true</c[success].</param>

Private Sub ImpersonateSpecificUser_eSpecificUserImpersonation (ByVal Success
As Boolean) Handles Me.eSpecificUserImpersonation

Me.Impersonated = Success

End Sub

End Class

### CLASS CODE ###

Usage :

Using UImp As New UserImpersonate.ImpersonateSpecificUser("Username" ,
"password", "Domain")

IF UImp.Impersonated Then

'all code here that must run in the user context or the method calls to
other procedures

End If

End Using

after this point the code runs in "Normall" modus

HTH
Michel Posseth [MCP]



"Zarborg" <Za*****@discussions.microsoft.comschreef in bericht
news:F0**********************************@microsof t.com...
I'm writing a little program that will run when a user logs in, checks
their
password expiration and also installs a piece of monitoring software if
necessary.
The program has to run on Vista so I got my first experience writing for
UAC.

I've worked though the signed manifest and all the other little quirky
stuff
I have to do to get my app to run as Administrator
(System.DirectoryServices
said it required admin rights) and everything is working just dandy.

But, I would also like to map drives for the user as I do this. Problem
is
that when I map the drive using the Admin split token privs, it actually
maps
the drive for the admin user, not the lower priv user token. So I see
that
it works, it reports that it works, even checking the existence of the
drive
letter work but the drive letters don't show for the end user.

Now for the weird $50 question.

Is there a way while my program is running under the Admin token to
execute
something as the user? Like open a cmd shell and run a simple net use
command?

I have this code running the mapping. Works great on XP, and works under
Vista but I just don't see the drives as the user on Vista. (comments
removed for space)

Dim myProcess As Process = New Process
myProcess.StartInfo.FileName = "cmd.exe"
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
myProcess.StartInfo.CreateNoWindow = True
myProcess.StartInfo.Arguments = "/C net use K: \\vail\vmdk /persistent:no"
myProcess.Start()
myProcess.WaitForExit(10000)
If System.IO.Directory.Exists(strDrive) Then
txtStatus.Text = txtStatus.Text & "->Success "
Else
txtStatus.Text = txtStatus.Text & "->Failed "
End If
Really hoping that made sense....

Aug 16 '08 #2
Hello Zarborg

Did the previous post solve your problem or can i give you anny further
assistance ?

regards

Michel

"Zarborg" <Za*****@discussions.microsoft.comschreef in bericht
news:F0**********************************@microsof t.com...
I'm writing a little program that will run when a user logs in, checks
their
password expiration and also installs a piece of monitoring software if
necessary.
The program has to run on Vista so I got my first experience writing for
UAC.

I've worked though the signed manifest and all the other little quirky
stuff
I have to do to get my app to run as Administrator
(System.DirectoryServices
said it required admin rights) and everything is working just dandy.

But, I would also like to map drives for the user as I do this. Problem
is
that when I map the drive using the Admin split token privs, it actually
maps
the drive for the admin user, not the lower priv user token. So I see
that
it works, it reports that it works, even checking the existence of the
drive
letter work but the drive letters don't show for the end user.

Now for the weird $50 question.

Is there a way while my program is running under the Admin token to
execute
something as the user? Like open a cmd shell and run a simple net use
command?

I have this code running the mapping. Works great on XP, and works under
Vista but I just don't see the drives as the user on Vista. (comments
removed for space)

Dim myProcess As Process = New Process
myProcess.StartInfo.FileName = "cmd.exe"
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
myProcess.StartInfo.CreateNoWindow = True
myProcess.StartInfo.Arguments = "/C net use K: \\vail\vmdk /persistent:no"
myProcess.Start()
myProcess.WaitForExit(10000)
If System.IO.Directory.Exists(strDrive) Then
txtStatus.Text = txtStatus.Text & "->Success "
Else
txtStatus.Text = txtStatus.Text & "->Failed "
End If
Really hoping that made sense....

Aug 24 '08 #3
Just getting a chance to work on this one again, got sidetracked with having
to install SCCM, SCOM, SharePoint 2007 integrated with Report Server 2005 and
2 brand new SQL servers. Doh!

I'll update again with either yea or nea next week. Thanks for the class btw!

"Michel Posseth [MCP]" wrote:
Hello Zarborg

Did the previous post solve your problem or can i give you anny further
assistance ?
Sep 5 '08 #4
Oh, but I do have a question on the code though.

Because this is running as the user already, just under their admin level
token I don't have access to their password, nor would I want them to have to
enter it again during the login process. I'm going to look at this code to
see if I can get it to impersonate the non-admin token of the currently
logged in user, but if you knew how already that would be swell.

-Z

"Michel Posseth [MCP]" wrote:
Hello Zarborg

Did the previous post solve your problem or can i give you anny further
assistance ?
Sep 5 '08 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
by: *no spam* | last post by:
I've got Visual Studio.Net 2002, IIs, MSDE and SQL Web Administrator running on XP Prof SP2. When I try to execute the SQL Web Administrator (SWA), it first brings up the SWA Dialog Box. I check...
0
by: Joe | last post by:
Hello: I have these tables where there's data that (apparentely) can only be seen when logged as Administrator on Windows 2000 and XP. This didn't happen before, and I think some security patch...
2
by: Simple Java Drinker | last post by:
I decided to reinstall the Windows XP on my computer by using the Repair Option. After typing "R" as required I am requested to input an administrator password. The problem is that no administrator...
6
by: Philip Wagenaar | last post by:
What is the best way to create a local user on the machine with administrator rights? I have problems with my code on machines that have password policy. The problem is that when the user is...
1
by: Daniel | last post by:
what permissions does a windows service need to execute another process? System.Diagnostics.Process process = System.Diagnostics.Process.Start(info); just local administrator? any specific...
3
by: W C Hull | last post by:
We have a request from Auditing to modify the password an a local workstation administrative account every 90 days. We are developing two programs - a VB6 GUI program that will allow the...
5
by: sawilla | last post by:
First, I'm new to Python. I'm getting and error when I run Python 2.5.2 as a regular user in Vista but not when I run Python as an administrator. For example, if I type "import numpy" after I...
5
by: nagar | last post by:
I'm using the Process.Start method to launch an application from C#. How can I launch the App as Administrator in Windows Vista? Thanks. Andrea
2
by: Scott | last post by:
Attempting to install WCF service on stand alone 2003 server as a admin user (not administrator but user "WCF" i.e user added to local admin group). It fails with user error: The description...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.