解決策(ちょっと):
.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