1

わかりました、これを短くしてみます。

まず、私が取得しようとしていることを正確に説明させてください。Windows エクスプローラーを開いてネットワーク ドライブに移動すると、そこに DFS タブがあります (ネットワーク上のサーバー経由で DFS を有効にする必要があるため、存在しない場合があります)。

そのタブには「紹介リスト」と呼ばれるリストがあります... そのボックスに何が入っているか知りたいです。これは DFS または UNC だと思います。訂正していただければ助かります。

私が持っているのは \domainname.com\something$\BUS\blah\myDriveHome ですが、これは、その共有が設定されている実際のサーバーを含むボックス内の別のものに関連付けられており、その共有はコンプライアンスを実行するために必要なものです小切手。

exeを配布できないため、Windows 7にパッケージ化されていないexeは他のexeでは使用できません。

それで、私は何をしましたか...コマンドライン、powershell、およびレジストリからのDFS / UNCパスなどを非常に徹底的に検索しましたが、うまくいきませんでした。コマンドライン「net use」は、サーバーではなくリンクされたパスのみを返すため、役に立ちません。

私が質問を投稿するのは、プログラミングに多くの時間を費やしている壁にぶつかったときだけです。

誰かが情報を持っていれば、それは感謝します。

ここに画像の説明を入力

ありがとう

4

2 に答える 2

0

PSEXEC と DFSUtil を使用して別の方向に進み、リモート PC 経由で DFS 情報を見つけました。多くの情報が返されますが、ファイルを読み取って UNC と一致させた後、PowerShell でフィルター処理しました。方法を投稿しますが、DFSUtil の他のいくつかのサイトにある情報と、何を探すべきか、および PSExec を使用して、自分の側でいくつかの主要な適応を行う必要がありました。PSEXECについてこれに注意します:

cmd.exe /s /c C:\Temp\psexec.exe 2> $null

その "2> $null" は、リターンがエラー チャネルにある場合に、頭痛の種やスクリプトのクラッシュを軽減します。エラーをキャッチするには、それなしで PS コンソールで実行する必要がありますが、50 以上のシステム チェックを実行する私のようなスクリプトがある場合、1 つのエラーだけですべてが停止することは望ましくありません。

于 2016-03-22T15:28:37.767 に答える
0

この回答の C# コードを盗み、.Net 2.0 で動作するようにいくつかの変更を加え、PowerShell 内で使用することができました。

$dfsCode = @'
using System;
using System.Runtime.InteropServices;

public static class Dfs
{
    private enum NetDfsInfoLevel
    {
        DfsInfo1 = 1,
        DfsInfo2 = 2,
        DfsInfo3 = 3,
        DfsInfo4 = 4,
        DfsInfo5 = 5,
        DfsInfo6 = 6,
        DfsInfo7 = 7,
        DfsInfo8 = 8,
        DfsInfo9 = 9,
        DfsInfo50 = 50,
        DfsInfo100 = 100,
        DfsInfo150 = 150,
    }

    [DllImport("netapi32.dll", SetLastError = true)]
    private static extern int NetApiBufferFree(IntPtr buffer);

    [DllImport("Netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern int NetDfsGetInfo(
        [MarshalAs(UnmanagedType.LPWStr)] string DfsEntryPath, // DFS entry path for the volume
        [MarshalAs(UnmanagedType.LPWStr)] string ServerName,   // This parameter is currently ignored and should be NULL
        [MarshalAs(UnmanagedType.LPWStr)] string ShareName,    // This parameter is currently ignored and should be NULL.
        NetDfsInfoLevel Level,                                 // Level of information requested
        out IntPtr Buffer                                      // API allocates and returns buffer with requested info
        );

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    private struct DFS_INFO_3
    {
        [MarshalAs(UnmanagedType.LPWStr)]
        public string EntryPath;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string Comment;
        public int State;
        public int NumberOfStorages;
        public IntPtr Storage;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    private struct DFS_STORAGE_INFO
    {
        public int State;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string ServerName;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string ShareName;
    }

    private static T GetStruct<T>(IntPtr buffer, int offset)where T:struct
    {
        T r = new T();
        r = (T) Marshal.PtrToStructure((IntPtr)((long)buffer + offset * Marshal.SizeOf(r)), typeof(T));
        return r;
    }

    public static string GetDfsInfo(string server)
    {
        string rval = null;
        IntPtr b;
        int r = NetDfsGetInfo(server, null, null, NetDfsInfoLevel.DfsInfo3, out b);
        if(r != 0)
        {
            NetApiBufferFree(b);

            // return passed string if not DFS
            return rval;
        }

        DFS_INFO_3 sRes = GetStruct<DFS_INFO_3>(b,0);
        if(sRes.NumberOfStorages > 0)
        {
            DFS_STORAGE_INFO sResInfo = GetStruct<DFS_STORAGE_INFO>(sRes.Storage,0);
            rval = string.Concat(@"\\", sResInfo.ServerName, @"\", sResInfo.ShareName, @"\");
        }

        NetApiBufferFree(b);

        return rval;
    }
}
'@

Add-Type -TypeDefinition $dfsCode

[Dfs]::GetDfsInfo('\\ad.domain.com\Share')

このコードは、Windows 7 に含まれている PowerShell 2.0 で動作します。

于 2015-08-06T19:58:10.207 に答える