3

解決策(ちょっと):

.NET のセキュリティを使用したこのなりすましでは、アプリケーション レベルのアクセスしか許可されないことが判明しました。COM オブジェクトはシステム レベルにあるため、偽装されたユーザーはそれをインスタンス化できません。実行可能ファイルを右クリックして「Run As...」を選択すると、プログラムは正常に機能しました。システムアクセスでプログラムを起動することがわかりました(実行しているユーザーがそれらの資格情報を持っていると仮定します)。現在、このメソッドを使用してこのアプリケーションを起動する外部プログラムを作成中です。

ヒントをありがとう:D


仮想マシンに Windows XP をインストールしています。これは私のドメインの一部ですが、ログインしているユーザーはローカル ユーザーのみです。明らかに、ネットワーク共有にアクセスしようとすると、ユーザー/パスワードの入力を求めるプロンプトが表示されます。

代替テキスト

仮想マシンでテストしているプログラムは、COM オブジェクトを使用して、別のプログラムからのデータとやり取りします。偽装しないと、適切な資格情報を持っていないため、エラーが発生します。

この問題について調査を行ったところ、VB.NET に関する適切な情報が掲載されている Web サイトがいくつか見つかりました。私が書いたコードの問題は、ネットワーク リソースにアクセスできるが、COM オブジェクトをインスタンス化できないことです。

インスタンス化を試みる前に資格情報プロンプト (上記) を入力して送信すると、正常に機能します。そのため、WinXP 資格情報プロンプトが行っていることで、私が行っていないことがあるに違いないと私は信じています。以下は、偽装に使用しているコードです。

Public Sub BeginImpersonation()
    Const LOGON32_PROVIDER_DEFAULT As Integer = 0
    Const LOGON32_LOGON_INTERACTIVE As Integer = 2
    Const SecurityImpersonation As Integer = 2

    Dim win32ErrorNumber As Integer

    _tokenHandle = IntPtr.Zero
    _dupeTokenHandle = IntPtr.Zero

    If Not LogonUser(_username, _domainname, _password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, _tokenHandle) Then
        win32ErrorNumber = System.Runtime.InteropServices.Marshal.GetLastWin32Error()
        Throw New ImpersonationException(win32ErrorNumber, GetErrorMessage(win32ErrorNumber), _username, _domainname)
    End If

    If Not DuplicateToken(_tokenHandle, SecurityImpersonation, _dupeTokenHandle) Then
        win32ErrorNumber = System.Runtime.InteropServices.Marshal.GetLastWin32Error()

        CloseHandle(_tokenHandle)
        Throw New ImpersonationException(win32ErrorNumber, "Unable to duplicate token!", _username, _domainname)
    End If

    Dim newId As New System.Security.Principal.WindowsIdentity(_dupeTokenHandle)
    _impersonatedUser = newId.Impersonate()
    _impersonating = True
End Sub

また、偽装メソッドにさまざまなフラグを送信しようとしましたが、何も機能していないようです。私が見つけたさまざまなフラグは次のとおりです。

Enum LOGON32_LOGON
    INTERACTIVE = 2
    NETWORK = 3
    BATCH = 4
    SERVICE = 5
    UNLOCK = 7
    NETWORK_CLEARTEXT = 8
    NEW_CREDENTIALS = 9
End Enum
Enum LOGON32_PROVIDER
    [DEFAULT] = 0
    WINNT35 = 1
    WINNT40 = 2
    WINNT50 = 3
End Enum
Enum SECURITY_LEVEL
    Anonymous = 0
    Identification = 1
    Impersonation = 2
    Delegation = 3
End Enum
4

3 に答える 3

1

私は以前にこれに遭遇し、2 つの異なる解決策を使用しました。最も簡単な方法は、サード パーティのアプリ使用することでした。ファイル。ただし、パスワードの有効期限が切れる場合は面倒です。

私が使用した他の解決策は、別の資格情報を使用して新しいプロセスを呼び出すことです。

        Dim myProcessStartInfo As ProcessStartInfo = New ProcessStartInfo

    With myProcessStartInfo

        .FileName = "file path and name"

        .Domain = "domainname"
        .UserName = "username"

        'password needs to be a SerureString
        Using NewPassword As New Security.SecureString
            With NewPassword
                For Each c As Char In "password".ToCharArray
                    .AppendChar(c)
                Next c
                .MakeReadOnly()
            End With
            .Password = NewPassword.Copy
        End Using

        'UseShellExecute must be false for impersonated process
        .UseShellExecute = False

    End With

    Using Process As New System.Diagnostics.Process
        With Process
            .StartInfo = myProcessStartInfo
            .Start()
        End With
    End Using
于 2009-06-05T05:06:40.553 に答える
0

あなたの定義で、私は使用します

LogonUser(_username, _domainname, _password, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, _tokenHandle)

ネットワーク経由で認証している私のコードで。あなたと同じように、私はリモートボックスでローカルユーザーになりすましています。ただし、これらの値を使用する理由を覚えていないほど昔のことです。

于 2009-05-04T21:08:57.400 に答える
0

マシン間でファイルをコピーするために、ネットワーク ドライブをマップするために同様のことを行います。私はコードを書きませんでしたが、次の 2 つの点を除いて、あなたのものとほとんど同じです。

  • Impersonate メソッドが戻った後、CloseHandle ルーチンを使用して両方のトークンを閉じてから、impersonator メソッドを終了します。

  • 偽装者の上部で最初に行われるのは、RevertToSelf の呼び出しです。これは、おそらく以前の偽装をキャンセルするためです。

それらが違いを生むかどうかはわかりませんが、試してみる価値はあります。関連する宣言は次のとおりです。

Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Long
Declare Auto Function RevertToSelf Lib "advapi32.dll" () As Long
于 2009-05-07T02:28:44.150 に答える