問題タブ [netapi32]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - Windows API 使用時の fatalExecutionEngineError
netapi32.dll
DFS 共有を操作するために呼び出される Windows API .dll を使用しようとしています。Windows Server 2008 R2 で DFS を使用しており、.NET 4.0 を使用しています。.NET でこのようなものを使用したことはありませんが、何が失敗しているのか理解できません。
NetDfsGetInfoDllImport
を呼び出して、DFS 共有に関する情報の取得をテストしています。関数から受け取りたい情報レベルの構造を作成する必要がありました。
次のコードを使用して、結果を取得して読み取りました。
行を読み取るまで、すべてがうまくいきますstorage
。
次のようなエラーが表示されることがあります。
ランタイムで致命的なエラーが発生しました。エラーのアドレスは、スレッド 0x1d44 の 0x626ac91c でした。エラー コードは 0xc0000005 です。このエラーは、CLR のバグ、またはユーザー コードの安全でない部分または検証不可能な部分のバグである可能性があります。このバグの一般的な原因には、COM 相互運用機能または PInvoke のユーザー マーシャリング エラーが含まれ、スタックが破損する可能性があります。
エラーの種類はfatalExecutionEngineErrorで、.NET Exception ではないため、キャッチできません。毎回発生するわけではありませんが、約 50% の確率でこのエラーが発生します。Windowsのエラー コードを調べると、5 が "アクセスが拒否されました" であることがわかります。IntPtr
初心者レベルの Comp Sci に精通しているだけなので、ポインター (オブジェクトとは何か) について少し理解しています。なぜこのエラーがたまにしか発生しないのか、まだわかりません。
このエラーを理解/回避するにはどうすればよいですか?
c++ - Windows Netapi32
私は現在、Netapi32
を使用して Windows にアクセスしています。現在、API へのアクセスNetapi32.lib
に使用しています。c++
コンピューター名の取得に問題があります。現在、NetFileEnum
hereのFILE_INFO_3
構造体hereの 1 つです。ドキュメントには、次のように書かれています。
fi3_ユーザー名
どのユーザー (ユーザー レベルのセキュリティを持つサーバー上) またはどのコンピューター (共有レベルのセキュリティを持つサーバー上) がリソースを開いたかを指定する文字列へのポインター。Windows は共有レベルのセキュリティをサポートしていないことに注意してください。_WIN32_WINNT または FORCE_UNICODE が定義されている場合、この文字列は Unicode です。
現在、このスクリプトを実行しているネットワークには確かに共有レベルのセキュリティがありますが、コンピューター名を一覧表示する方法がわかりません。
関連コード
ライブラリには以下が含まれます:
構造を開始する:
fstatus
私のコードでは、 として定義されていますNET_API_STATUS fStatus
。これは I/O 構造です。ドキュメントはこちら
成功した場合fstatus
は戻り値NERR_Success
。
関数が失敗した場合、戻り値は次のエラー コードのいずれかになります。
ERROR_ACCESS_DENIED
ユーザーは要求された情報にアクセスできません。ERROR_INVALID_LEVEL
level パラメータに指定された値が無効です。ERROR_INVALID_PARAMETER
指定されたパラメーターは無効です。ERROR_MORE_DATA More
エントリが利用可能です。すべてのエントリを受信するのに十分な大きさのバッファを指定してください。- ....
詳細はこちら
私が使用するものを処理するにはif ((fStatus == NERR_Success) || (fStatus == ERROR_MORE_DATA))
ユーザー名が見つかりませんでした。
上記の RAW 値:
pTmpfile
レベル 3 (ドキュメントはこちら) のバッファ オブジェクトです。
bufptr [アウト]
このバッファは、次の形式でデータを返します。
データの取得:
**vbnet を使用してこれを試してみたところ、うまくいきましたが、c++ での方法がわかりません。
完全なテスト プログラム:
出力:
ビルドから:
走る:
c - スレッドが外部で終了したときの NetServerEnum ブロック
(Win32 api で動作し、VS2010 の C 環境で)
私は2スレッドアプリを持っています。最初のスレッドは 2 番目のスレッドを fork し、指定された間隔 (「TIMEOUT」) の間待機してから、それを呼び出しますTerminateThread()
。一方、2 番目のスレッドは を呼び出しますNetServerEnum()
。
正常に返されたかどうかにかかわらず、タイムアウトに達するとNetServerEnum
、最初のスレッドがデッドロックされるようです。NetServerEnum
独自のワーカースレッドを作成することはすでに気づいています。
最終的に、これらのスレッドの 1 つがデッドロックになり、通常は でntdll.dll!RtlInitializeExceptionChain
プロセスを正常に終了できなくなります。
windows - NetServerEnum は閉じないワーカー スレッドを作成します
以前に尋ねられたSO の質問を解決しようとしているときに、スレッドがなくても問題が発生することがわかりました。
私が今持っているのは、- を呼び出す非常に単純なシングル スレッド コードですNetServerEnum()
。NetApiBufferFree()
返されると、プロセスを終了するはずの main から呼び出されて返されます。その時点で、私のスレッドは本当に終了しますが、プロセスは終了しません.4つのスレッドが開かれているためです(私ではありません):
1 * ntdll.dll!TplsTimerSet+0x7c0
(スタックはntdll.dll!WaitForMultipleObjects
)
(これは への呼び出しで開かれましたNetServerEnum()
)
3 * ndll.dll!RtValidateHeap+0x170
(スタックはntdll.dll!ZwWaitWorkViaWorkerFactory+0xa
)
(これらは私のコードが戻ったときに開いています)
更新:
ntdll.dll!TplsTimerSet+0x7c0 を外部で (プロセス エクスプローラーを使用して) 実行しているスレッドを強制終了すると、が返される前にmain()
、プログラムは正常に終了します。知っておくと便利だなと思いました。
UPDATE2: (いくつかの技術情報) 私が使用している: Win7 Enterprise SP1上のMS Visual Studio 2010 Ultimate x64 (SP1Rel) コードは C (ただし、c++ スイッチがオンになっているのでコンパイル) サブシステム: WINDOWS コンパイラ: cl.exe (IDE を使用)他のすべてのパラメータはデフォルトです。
私は自己変更されたエントリポイント ( /ENTRY:"entry"
) を使用していますが、それは私のプログラムで唯一の機能です):
前述のすべてのテストは、約 100 ユニットの Windows ドメイン ネットワーク内で実行されました。
更新 3: (非仮想) WinXP 32bitでテストした場合、この問題は発生しません。(同じバイナリですが、Win7 x64 では 2 つのバイナリがテストされました - 32bit over WOW とネイティブ x64)
windows - Go で Windows ユーザー アカウントを管理するにはどうすればよいですか?
Go アプリケーションから Windows ローカル ユーザー アカウントを管理できるようにする必要がありますが、CGo を使用しないとネイティブ バインディングがないように見えます。
私の最初の検索では、「exec.Command」を使用して「net user」コマンドを実行するのが最善であると言う人々が見つかりましたが、応答コードの解析に関しては、面倒で信頼性がないようです。
この種のものを処理する関数が netapi32.dll ライブラリにあることがわかりましたが、Go は Windows ヘッダー ファイルをネイティブにサポートしていないため、これらの関数を呼び出すのは簡単ではないようです。
https://github.com/golang/sys/tree/master/windowsから例を挙げると、Go チームはコード内のすべてを再定義してから DLL 関数を呼び出しているようです。
私はそれを一緒にラップするのに苦労していますが、私が目指している低レベル API のこのテンプレートを取得し、コアの Go ランタイムと同じように、その上に高レベル API をラップしています。
これをまとめる最良の方法は何ですか?
c# - C# を使用してサーバー上のリソースへの現在の接続を取得する方法 (「net file」コマンドからの出力と同様)
コマンド プロンプトでnet file
を実行すると、共有フォルダで開いているリソースが表示され、リソースにアクセスしているユーザー名も表示されます。
同じ情報は、コンピューターの管理 (compmgmt.msc) -> システム ツール -> 共有フォルダー -> 開いているファイルから参照できます。
VBScript を使用して同じ情報にアクセスできます。
これと同じ情報に C# 経由でアクセスするにはどうすればよいでしょうか? new file
( C# からコマンドを実行しないと、リソース内の長いパス名が切り捨てられます)。
WMI (どのクラスですか? -Win32_ServerConnection
開いているリソースのパスを提供していないと思います; と同じWin32_ServerSession
) または Netapi32.dll を使用して、この情報にアクセスすることは可能ですか? もしそうなら、どうすればこれを行うことができますか?
注:コマンド プロンプトおよびコンピューター管理からスクリーンショットの情報と同様に、開かれたファイルのフル パスを取得する方法が必要です。
何か案は?
windows - セキュリティ サポート パッケージの削除
そのため、特殊なコントロールのセキュリティ サポート プロバイダーを管理するために、powershell スクリプトに取り組んでいます。現在、SSP を追加するスクリプトが動作していますが、スクリプトを ssp を削除するように変更しようとすると、スクリプトが壊れます。
コードは次のとおりです。
これを実行するたびに、「1」引数で「DeleteSecurityPackage」を呼び出す例外:「要求された機能はサポートされていません」
ただし、ssp を追加するこのコードは正常に動作します。
構造体について心配する必要がないので、本来は削除が簡単なはずですが、満足ではありません。
任意の助けをいただければ幸いです
c# - NetApi32 から NetServerEnum を使用中にアクセスが拒否されました
NetApi32 dll から NetServerEnum 関数を使用しようとしていますが、エラー コード 5: "アクセスが拒否されました" しか表示されません。以下は、外部 dll 関数への私の呼び出しです。
関数は次のように宣言されています。
ドメイン名を関数呼び出しに追加して、別の情報レベルで呼び出してみましたが、どちらも機能しませんでした。
関数のマイクロソフト ドキュメントへのリンクは次のとおりです。
この関数呼び出しには特定の権利セットが必要ですか? ここで明らかに何かが欠けていますが、何がわかりません。