0

非常に奇妙な問題があり、可能な解決策について質問があります。C++ で記述されたプログラム (ネイティブ WinAPI を使用) から、Windows コンピューターで完全修飾識別名を取得する必要があります。そのために、次の API を使用します。

TCHAR buff[256];
DWORD dwSz = 256;
GetUserNameEx(NameFullyQualifiedDN, buff, &dwSz);

上記のコードは、ユーザー モード プロセス (ユーザー デスクトップ) から実行するとまったく機能しません。しかし、システム サービスからその API を呼び出すと、3 ~ 4 秒間返されません。(上記のコードは、Active Directory ドメインのメンバーではないシステムで呼び出される可能性があります。)

だから私の最初の質問は、なぜサービスからそれを呼び出すことが問題になるのでしょうか?

2 番目の質問は、サービスの開始時にその API を呼び出し、後でその結果をグローバル変数にキャッシュし、後で代わりに使用した場合、そのシステムで識別名が変更される可能性はどのくらいですか?

4

1 に答える 1

1

システムがドメインのメンバーでない場合、API呼び出しは失敗します。

ローカルシステムとして実行した場合とユーザーコンテキストとして実行した場合に何が起こっているのかを正確に言うのは難しいです。ネットワークトレースから始めて、何が起こっているのかを確認することから始めます。

ユーザーのDNが静的であるとは想定していません。これは、管理者がいつでも変更できるものです。

DsCrackNamesワークフローの追加:

  1. 呼び出しDsBind-最初の2つのパラメーターにNULLを渡して、ハンドルを取得します
  2. DsCrackNames#1 、、、、およびコンピュータの名前からのハンドルを使用してDS_NAME_NO_FLAGS呼び出しDS_FQDN_1779_NAMEます。マシンの名前に$を追加する必要がある場合があります。
  3. DsFreeNameResult結果を漏らさないように電話してください
  4. DsUnBind#1からハンドルが漏れないように電話してください
于 2012-04-18T15:12:06.220 に答える