3

LocalSystem アカウントとして実行される Windows サービスから、パスワードで保護されたリモートの共有フォルダーに接続しようとしています。LocalSystem アカウントは、WNetAddConnection2() または同様の呼び出しを使用して、パスワードで保護されたネットワーク共有に直接アクセスできないようです。誰でもこれを確認できますか?管理者ユーザーになりすますことが最善の方法である可能性があることを読みました。WNetAddConnection2() の前に LogonUser() と ImpersonateLoggedOnUser() を使用してみました。ネットワーク パスのマウントは成功しているように見えますが、実際のアクセス (リモート フォルダ内のファイルの列挙など) は失敗します。何か案は?

ありがとう。

4

5 に答える 5

3

私もこの問題に遭遇したばかりで、リモート コンピューター名をユーザー名に入れるとうまくいくことがわかりました。(私は実際にはこれを理解していませんでした。コード内の別の場所で既にこれを行っていたので、それが可能であることがわかり、最終的に違いがわかりました。)

たとえば、次のようになります。

WNetAddConnection2(&nr, "password", "SomeComputer\\Username", 0);

LogonUser や ImpersonateLoggedOnUser などの特別な呼び出しは行っていません。

これは、SYSTEM アカウントで実行されているサービスにあります。

私は SomeComputer\Administrator アカウントを使用しようとはしていませんが、いずれにせよ、それは良い習慣ではありません。SomeComputer で通常のユーザー アカウントを使用しています。

于 2013-08-15T17:25:04.030 に答える
2

信頼を伝えるために、私は常にドメイン環境でのみ作業し、パスワードで保護されたネットワーク共有を使用していませんでしたが、接続を確立するには、WNetAddConnection2API とNetUseAddAPI という 2 つの主な方法があることを知っています。NetUseAddレベル 1 ( ) で関数を試すことをお勧めしますUSE_INFO_1。、 、のみをUSE_INFO_2使用しましたが、しかないため、パスワードで保護された共有への接続用に作成された機能のように見えます。ui2_usernameui2_domainnameui2_passwordUSE_INFO_1ui1_password

ところで、LogonUser() は、ローカル コンピューターでローカルログインを行い、リモート コンピューターへのセッションを確立する必要があるため、まったく意味がありません。これは機能WNetAddConnection2NetUseAddます。

于 2010-06-03T23:02:46.197 に答える
1

ローカル システム アカウント (「NT AUTHORITY\SYSTEM」) からネットワーク共有にアクセスする方法:

  1. 非ドメイン ネットでもネットワークにアクセスできるローカル アカウントを使用してログオンする必要があります。これを取得するには、「NT AUTHORITY\NETWORK SERVICE」アカウントを使用するだけで十分です
  2. アクセス資格情報を指定して、ネットワーク共有接続を追加します。

ここでの主なポイントは、 LogonUser() 呼び出し中にLOGON32_LOGON_NEW_CREDENTIALSログオン タイプを使用することです (詳細/制限については MSDN を参照してください)。そうしないと、LogonUser と偽装が成功した場合でも、WNetAddConnection2() の実行時に ERROR_NO_SUCH_LOGON_SESSION が返されます。


LogonUser("NETWORK SERVICE", "NT AUTHORITY", NULL, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &hToken );
ImpersonateLoggedOnUser(hToken);
NETRESOURCE nr;
nr.dwScope = RESOURCE_GLOBALNET;
nr.dwType = RESOURCETYPE_DISK;
nr.dwUsage = RESOURCEUSAGE_CONNECTABLE;
nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
nr.lpRemoteName = "\\\\SomeCopmuter\\C$";
nr.lpLocalName = "Z:";
WNetAddConnection2(&nr, "password", "Administrator", 0);

ノート

  • 偽装は現在のスレッドに対してのみ動作します。
  • ローカル リソースでは LocalSystem として機能し、追加された共有では、WNetAddConenction2 で指定されたリモート コンピューター (この場合は SomeComputer の管理者) のユーザーとして機能します。
  • NETRESOURCE でドライブ文字の使用を省略し、「\server\share\filename.ext」表記でファイルにアクセスできます
  • これは一部の古いシステムでは機能しない可能性があります (NT/2000、正確なリストは不明)
于 2011-04-26T18:49:39.183 に答える
0

私は実際に同じ問題に取り組んでいます、Flavio、そして私の現在の疑いは、誰かがマシンにインタラクティブにログオンしている場合は機能し、誰もログオンしていない場合はERROR_NO_SUCH_LOGON_SESSIONを返すということです。しかし、私は間違っているかもしれません。もっと来ます。私はこの質問にスターを付けました。もう一度確認します:)

于 2010-06-03T19:39:48.077 に答える
0

win32netcon から win32wnet をインポート RESOURCETYPE_DISK を DISK path="\192.168.1.11\Student" としてインポート win32wnet.WNetAddConnection2(DISK,"R:","\192.168.1.11\Student",None,"Student","pass",0)

于 2014-05-29T07:11:45.907 に答える