【问题标题】:How to get network path of a directory using command line如何使用命令行获取目录的网络路径
【发布时间】:2021-04-12 08:28:20
【问题描述】:

假设我在 windows 中有一个名为 Temp 的目录。

当我右键单击它并打开属性,然后转到Sharing 选项卡时,我看到了这个:

字段Network Path 是Not Shared。

现在我点击Share并选择分享并点击确定。

Network Path 字段现在具有值:

有没有办法从命令行获取Network Path 的值。

理想情况下,我正在寻找一个将目录路径作为输入的命令,例如C:\Temp,如果目录是共享的,则输出\\S5XXXXXXN\Temp,如果目录不共享,则输出Not Shared。

背景:我有一个 NSIS 脚本来创建安装程序。安装过程结束应该吐出一个属性列表。输出所需的属性之一是目录的Network Path。在 NSIS 中,我可用的是 C:\Temp,我想在将其吐出之前将其转换为 \\S5XXXXXXN\Temp(如果可用)。

我尝试使用这个https://nsis.sourceforge.io/Get_Universal_Name,但它不起作用。

DetailPrint "My directory is:"
# value of MYDIR is C:\Temp
DetailPrint $MYDIR
Push $MYDIR
Call get_universal_name
Pop $MYDIRNET
DetailPrint "My dir after call is: "
DetailPrint $MYDIRNET
# above also prints C:\Temp even though its shared and has value \\S5XXXXXXN\Temp

更新:

@Anders 下面的答案就像一个魅力。

返回的列表有一个带有空白$3 的条目。只是要注意并在需要时添加必要的检查。

【问题讨论】:

  • .nsi 中的 RequestExecutionLevel 设置是什么?
  • @Anders RequestExecutionLevel 在我的 .nsi 中设置为管理员
  • @Anders 我尝试使用 WNetGetUniversalNameA 和 WNetGetUniversalNameW 以及像某些线程建议的那样.. 但没有区别.. 仍然是相同的结果..

标签: windows command-line powershell-3.0 nsis


【解决方案1】:

get_universal_name 调用WNetGetUniversalName 并且此函数仅支持映射驱动器号(net.exe use 样式)。 WNetGetConnection 似乎也有同样的限制。即使这个限制不存在,它仍然不起作用,因为a process elevated with UAC does not share the net connections with non-elevated processes。

另一种方式似乎确实可行,获取共享列表及其本地路径:

!include LogicLib.nsh

Section "Check shares"
System::Call 'NETAPI32::NetShareEnum(p0,i2,*p.r1,i-1,*i0r5,*i0,p0)i.r0'
${If} $0 = 0
    Push $1
    ${DoWhile} $5 <> 0
        System::Call '*$1(p.r2,i,p,i,i,i,p.r3,p,&l.r4)'
        IntPtrOp $1 $1 + $4
        System::Call '*$2(&w${NSIS_MAX_STRLEN}.r2)'
        System::Call '*$3(&w${NSIS_MAX_STRLEN}.r3)'
        System::Call 'NETAPI32::NetServerGetInfo(p0,i100,*p.r4)' ; Get computer name
        System::Call '*$4(i,w.s)'
        System::Call 'NETAPI32::NetApiBufferFree(p$4)'
        Pop $4
        DetailPrint "$3=\\$4\$2"
        ; ${If} $3 == "$MYDIR" ...TODO... ${EndIf}
        IntOp $5 $5 - 1
    ${Loop}
    System::Call 'NETAPI32::NetApiBufferFree(ps)'
${EndIf}
SectionEnd

【讨论】:

  • 像魅力一样工作!太感谢了!列表中的一项具有空白 $3。已更新我的问题,以反映将来可能使用此功能的人。
  • 空白是正常的,IPC是特殊的。 API 确实返回 share=path 并且并非所有内容都有路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2010-10-11
  • 2013-07-22
  • 1970-01-01
  • 2018-03-12
相关资源
最近更新 更多