VB.NETで次の資格情報プロセスを複製することは可能ですか?
-
03-07-2019 - |
質問
ソリューション(ちょっと):
.NETのセキュリティでこのなりすましを無効にすると、アプリケーションレベルのアクセスのみが許可されます。 COMオブジェクトはシステムレベルにあるため、偽装ユーザーはインスタンス化できません。実行可能ファイルを右クリックして[実行]を選択すると、プログラムが正常に機能することがわかりました。システムにアクセスしてプログラムを起動することがわかりました(実行しているユーザーがそれらの資格情報を持っていると仮定します)。現在、このメソッドを使用してこのアプリケーションを起動する外部プログラムを作成しています。
ヒントをありがとう: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
解決
以前にこれに遭遇し、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