以程序方式获取DFS / UNC信息 - Java

时间:2015-08-06 16:42:22

标签: java powershell powershell-v2.0 unc dfs

好的,我会尽量保持这一点。

首先让我解释一下我想要得到什么。如果您打开Windows资源管理器并转到网络驱动器,那里有一个DFS选项卡(必须启用DFS才能对网络上的服务器进行VIA,因此可能不在那里)。

在该选项卡中有一个名为"推荐列表的列表" ...我想要该框中的内容。我相信这是DFS或UNC,你可以纠正我,它会帮助我。

我所拥有的是\ domainname.com \ something $ \ BUS \ blah \ myDriveHome但这与该框中的其他内容相关联,其中包含该共享所设置的实际服务器,该共享是我需要的进行合规性检查。

我不能使用不是Windows 7包而不是任何其他exe的exe,因为我们无法分发exes。

所以我做了什么...从命令行,powershell和注册表中彻底搜索DFS / UNC路径之类的东西,没有去。命令行" net use"只返回链接路径而不是服务器,这样就没用了。

当我碰到占用大量编程时间的墙时,我才发布过一个问题。

如果有人有信息,那将会很感激。

enter image description here

由于

2 个答案:

答案 0 :(得分:0)

我能够在this answer here中窃取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。

答案 1 :(得分:0)

我通过使用PSEXEC和DFSUtil来寻找远程PC上的DFS信息。返回很多信息但我在阅读文件并匹配UNC后在PowerShell中对其进行了过滤。我会发布如何,但我必须做一些主要适应我的结束与DFSUtil的其他几个网站上的信息以及寻找什么和PSExec。我会在PSEXEC中注意到这一点:

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

如果返回在错误通道中,“2&gt; $ null”将为您节省一些麻烦,并且您的脚本会崩溃。您将需要在PS控制台中运行它,但没有它来捕获错误,但是当您有一个像我的脚本执行50+系统检查时,您不希望整个事情只停止一个错误。