如果我有用户名和密码,如何使用另一个身份在 asp.net 中执行我的代码

发布于 2024-07-14 02:48:51 字数 167 浏览 5 评论 0原文

我正在构建一个小型的基于网络的管理应用程序。 在其中我需要通过 wmi 使用不同的帐户连接到不同的服务器。

我想要的是告诉我的应用程序:你现在由 user1 运行,执行此操作。 然后我想告诉它:现在你是user2,做这个,做这个。

我想,我的问题不太清楚,我会重构它。

I'm building a small web based management app.
Within it I need to connect to different servers using different accounts via wmi.

What I want is to tell my app: you are now run by user1, do this and this.
And then I want to tell it: now you are user2, do this and this.

I guess, I'm not all that clear with my question, I'll refactor it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

两个我 2024-07-21 02:48:51

您必须编写一段单独的 .Net 代码(也有一些非托管调用)来执行用户模拟,然后在模拟该用户的同时调用您的代码。 然后您可以恢复用户帐户:

对 VB 示例表示歉意,但这很容易移植到 C#。


VB示例

Public Class UserImpersonation

    Private Declare Auto Function LogonUser 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 Boolean

    <DllImport("kernel32.dll")> _
    Private Shared Function FormatMessage(ByVal dwFlags As Integer, ByRef lpSource As IntPtr, _
        ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, ByRef lpBuffer As [String], _
        ByVal nSize As Integer, ByRef Arguments As IntPtr) As Integer

    End Function

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

    Private Declare Auto Function DuplicateToken Lib "advapi32.dll" (ByVal ExistingTokenHandle As IntPtr, _
            ByVal SECURITY_IMPERSONATION_LEVEL As Integer, _
            ByRef DuplicateTokenHandle As IntPtr) As Boolean

    <PermissionSetAttribute(SecurityAction.Demand, Name:="FullTrust")> _
    Public Shared Function ImpersonateUser(ByVal strDomain As String, ByVal strUserid As String, ByVal strPassword As String) As WindowsImpersonationContext

        Dim tokenHandle As New IntPtr(0)
        Dim dupeTokenHandle As New IntPtr(0)

        Try
            ' Get the user token for the specified user, domain, and password using the 
            ' unmanaged LogonUser method.  
            ' The local machine name can be used for the domain name to impersonate a user on this machine.

            Const LOGON32_PROVIDER_DEFAULT As Integer = 0
            'This parameter causes LogonUser to create a primary token.
            Const LOGON32_LOGON_INTERACTIVE As Integer = 2

            tokenHandle = IntPtr.Zero

            ' Call LogonUser to obtain a handle to an access token.
            Dim returnValue As Boolean = LogonUser(strUserid, strDomain, strPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, tokenHandle)

            If returnValue = False Then
                Dim ret As Integer = Marshal.GetLastWin32Error()
                Throw New System.ComponentModel.Win32Exception(ret)
            Else
                ' Use the token handle returned by LogonUser.
                Dim newId As New WindowsIdentity(tokenHandle)
                Dim ImpersonatedUser As WindowsImpersonationContext = newId.Impersonate()

                Return ImpersonatedUser
            End If

        Catch ex As Exception
            Console.WriteLine("UserImpersonation.impersonateUser Exception Occurred: " + ex.Message)

            Return Nothing
        End Try

        ' Free the tokens.
        If Not System.IntPtr.op_Equality(tokenHandle, IntPtr.Zero) Then
            CloseHandle(tokenHandle)
        End If
    End Function


    Public Shared Function UndoImpersonate(ByVal WIC As WindowsImpersonationContext) As Boolean
        Try
            ' Stop impersonating the user.
            WIC.Undo()

            Return True
        Catch ex As Exception
            Console.WriteLine(("Exception occurred. " + ex.Message))

            Return False
        End Try

    End Function
End Class

You would have to write a seperate piece of .Net code (some umanaged calls too) to perform impersonation of your user then call your code whilst impersonating that user. You can then restore the user account afterwards:

Apologies for the VB sample, but this would be easy to port to C#.


VB Sample

Public Class UserImpersonation

    Private Declare Auto Function LogonUser 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 Boolean

    <DllImport("kernel32.dll")> _
    Private Shared Function FormatMessage(ByVal dwFlags As Integer, ByRef lpSource As IntPtr, _
        ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, ByRef lpBuffer As [String], _
        ByVal nSize As Integer, ByRef Arguments As IntPtr) As Integer

    End Function

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

    Private Declare Auto Function DuplicateToken Lib "advapi32.dll" (ByVal ExistingTokenHandle As IntPtr, _
            ByVal SECURITY_IMPERSONATION_LEVEL As Integer, _
            ByRef DuplicateTokenHandle As IntPtr) As Boolean

    <PermissionSetAttribute(SecurityAction.Demand, Name:="FullTrust")> _
    Public Shared Function ImpersonateUser(ByVal strDomain As String, ByVal strUserid As String, ByVal strPassword As String) As WindowsImpersonationContext

        Dim tokenHandle As New IntPtr(0)
        Dim dupeTokenHandle As New IntPtr(0)

        Try
            ' Get the user token for the specified user, domain, and password using the 
            ' unmanaged LogonUser method.  
            ' The local machine name can be used for the domain name to impersonate a user on this machine.

            Const LOGON32_PROVIDER_DEFAULT As Integer = 0
            'This parameter causes LogonUser to create a primary token.
            Const LOGON32_LOGON_INTERACTIVE As Integer = 2

            tokenHandle = IntPtr.Zero

            ' Call LogonUser to obtain a handle to an access token.
            Dim returnValue As Boolean = LogonUser(strUserid, strDomain, strPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, tokenHandle)

            If returnValue = False Then
                Dim ret As Integer = Marshal.GetLastWin32Error()
                Throw New System.ComponentModel.Win32Exception(ret)
            Else
                ' Use the token handle returned by LogonUser.
                Dim newId As New WindowsIdentity(tokenHandle)
                Dim ImpersonatedUser As WindowsImpersonationContext = newId.Impersonate()

                Return ImpersonatedUser
            End If

        Catch ex As Exception
            Console.WriteLine("UserImpersonation.impersonateUser Exception Occurred: " + ex.Message)

            Return Nothing
        End Try

        ' Free the tokens.
        If Not System.IntPtr.op_Equality(tokenHandle, IntPtr.Zero) Then
            CloseHandle(tokenHandle)
        End If
    End Function


    Public Shared Function UndoImpersonate(ByVal WIC As WindowsImpersonationContext) As Boolean
        Try
            ' Stop impersonating the user.
            WIC.Undo()

            Return True
        Catch ex As Exception
            Console.WriteLine(("Exception occurred. " + ex.Message))

            Return False
        End Try

    End Function
End Class
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文