質問

ソリューション(ちょっと):

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

ヒントをありがとう:D


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

 alt text

仮想マシンでテストしているプログラムは、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
役に立ちましたか?

解決

以前にこれに遭遇し、2つの異なる音声を使用しました-最も簡単なのは、サードパーティのアプリを使用することでした:TqcRunas: http://www.quimeras.com/Products/products.asp を使用すると、暗号化されたファイルに必要な証明書をパッケージ化できます。ただし、パスワードの有効期限を強制される場合は苦痛です。

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

        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

他のヒント

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

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

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

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

  • Impersonateメソッドが返された後、CloseHandleルーチンを使用して、偽装メソッドを終了する前に両方のトークンを閉じます。

  • なりすましの最上部で最初に発生するのは、RevertToSelfの呼び出しです。これは、おそらく以前のなりすましをキャンセルするためです。

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

Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal handle As IntPtr) As Long
Declare Auto Function RevertToSelf Lib "advapi32.dll" () As Long
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top