Удалённые Рабочие Столы и Локальные диски.

Вам не хватает чего-то в Far? Вы считаете, что вашу идею стоит услышать? Пишите сюда.
Post Reply
User avatar
cmd.exe
Posts: 317
Joined: Fri 16 Apr, 2010 18:26
Location: Нижний Новгород
Has thanked: 168 times
Been thanked: 5 times
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by cmd.exe » Fri 04 Mar, 2016 11:16

Давно встретился с тем,что Фар не умеет работать с Локальными дисками при работе через RDP.
Если есть какие-то идеи у сообщество буду рад услушить. Про \\tsclient\... знаем, но хотим что-бы из коробки.
I've been using Vim for about 2 years now, mostly because I can't figure out how to exit it. (c) I Am Devloper
I know nothing except the fact of my ignorance. (с) Socrates

User avatar
DrKnS
Posts: 4535
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by DrKnS » Fri 04 Mar, 2016 12:53

\\tsclient и есть изкоробки, изкоробочнее не бывает.

User avatar
cmd.exe
Posts: 317
Joined: Fri 16 Apr, 2010 18:26
Location: Нижний Новгород
Has thanked: 168 times
Been thanked: 5 times
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by cmd.exe » Fri 04 Mar, 2016 13:35

DrKnS wrote:\\tsclient и есть изкоробки, изкоробочнее не бывает.
Имеется ввиду по Alt+F1 и Alt+F2
I've been using Vim for about 2 years now, mostly because I can't figure out how to exit it. (c) I Am Devloper
I know nothing except the fact of my ignorance. (с) Socrates

User avatar
Freeman
Posts: 28
Joined: Thu 20 Nov, 2014 20:10
Location: Санкт-Петербург
Has thanked: 5 times
Been thanked: 1 time
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by Freeman » Thu 16 Jun, 2016 02:58

Таки да, было бы удобно видеть их как в Проводнике.
Разработчик языка программирования Кантор

Smitis
Posts: 1440
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 22 times
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by Smitis » Wed 22 Jun, 2016 22:31

Добавление пункта выбора \\tsclient-дисков в меню выбора дисков
  1. local TsClientId = "4B787BF1-4846-4FC9-9D63-A1D5E2D60FF8"
  2.  
  3. local F = far.Flags
  4.  
  5. MenuItem {
  6.  
  7.     description = "TSCLIENT";
  8.  
  9.     menu = "Disks";
  10.  
  11.     guid = TsClientId;
  12.  
  13.     text = "TSCLIENT";
  14.  
  15.     action = function(openfrom,item)
  16.  
  17.         local h = io.popen(win.GetEnv("SystemRoot").."\\system32\\net.exe use")
  18.  
  19.         local s = h:read()
  20.  
  21.         local tsdisks = {}
  22.  
  23.         while s do
  24.  
  25.             s = win.OemToUtf8(s):match("\\\\TSCLIENT\\%S+")
  26.  
  27.             if s then
  28.  
  29.                 tsdisks[#tsdisks+1] = {disk=s,text=s:gsub("(\\\\TSCLIENT\\)(.)","%1&%2")}
  30.  
  31.             end
  32.  
  33.             s = h:read()
  34.  
  35.         end
  36.  
  37.         h:close()
  38.  
  39.         if #tsdisks > 0 then
  40.  
  41.             local res,pos = far.Menu(
  42.  
  43.                 {
  44.  
  45.                     X = openfrom==F.OPEN_LEFTDISKMENU and 10 or (APanel.Left and APanel.Width+10 or PPanel.Width+10),
  46.  
  47.                     Title="TS Disks", Bottom="", Id=win.Uuid(TsClientId),
  48.  
  49.                     MaxHeight=Far.Height-10,
  50.  
  51.                 },
  52.  
  53.                 tsdisks
  54.  
  55.             )
  56.  
  57.             if pos then
  58.  
  59.                 local ap = (openfrom==F.OPEN_LEFTDISKMENU and APanel.Left or openfrom==F.OPEN_RIGHTDISKMENU and not APanel.Left) and 1 or 0
  60.  
  61.                 panel.SetPanelDirectory(nil,ap,tsdisks[pos].disk)
  62.  
  63.             end
  64.  
  65.         end
  66.  
  67.     end;
  68.  
  69. }
Разум когда-нибудь победит.

Smitis
Posts: 1440
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 22 times
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by Smitis » Sat 25 Jun, 2016 16:13

Задался вопросом, а как получить список дисков не через net use. Весь поиск приводит к WNetOpenEnum, WNetEnumResource
Но вот такое приводит к ошибке 487 "Попытка обращения к неверному адресу".
  1. local function ShowErr(err)
  2.  
  3.     if err==0 then return "" end
  4.  
  5.     far.Message( tostring(err), "ERROR", nil, "we" )
  6.  
  7. end
  8.  
  9.  
  10.  
  11. local ffi = require "ffi"
  12.  
  13. local C = ffi.C
  14.  
  15. local function safe_cdef(def) pcall(ffi.cdef,def) end
  16.  
  17. local mpr = ffi.load("mpr.dll")
  18.  
  19.  
  20.  
  21. -- winnetwk.h
  22.  
  23. local RESOURCE_CONNECTED = 0x00000001
  24.  
  25. local RESOURCE_GLOBALNET = 0x00000002
  26.  
  27. local RESOURCETYPE_ANY = 0
  28.  
  29. local RESOURCETYPE_DISK = 0x00000001
  30.  
  31. local ERROR_NO_MORE_ITEMS = 259
  32.  
  33. local RESOURCEUSAGE_CONNECTABLE = 0x00000001
  34.  
  35. local RESOURCEUSAGE_CONTAINER = 0x00000002
  36.  
  37. local RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004
  38.  
  39. local TSCLIENT = "\\\\TSCLIENT\0"
  40.  
  41.  
  42.  
  43. safe_cdef [=[
  44.  
  45.     typedef struct _NETRESOURCE {
  46.  
  47.         DWORD  dwScope;
  48.  
  49.         DWORD  dwType;
  50.  
  51.         DWORD  dwDisplayType;
  52.  
  53.         DWORD  dwUsage;
  54.  
  55.         LPTSTR lpLocalName;
  56.  
  57.         LPTSTR lpRemoteName;
  58.  
  59.         LPTSTR lpComment;
  60.  
  61.         LPTSTR lpProvider;
  62.  
  63.     } NETRESOURCE, *LPNETRESOURCE;
  64.  
  65. ]=]
  66.  
  67. ffi.cdef [=[
  68.  
  69.     DWORD WNetOpenEnumW( // https://msdn.microsoft.com/en-us/library/windows/desktop/aa385478.aspx
  70.  
  71.         DWORD         dwScope,       // _In_
  72.  
  73.         DWORD         dwType,        // _In_
  74.  
  75.         DWORD         dwUsage,       // _In_
  76.  
  77.         LPNETRESOURCE lpNetResource, // _In_
  78.  
  79.         LPHANDLE      lphEnum        // _Out_
  80.  
  81.     );
  82.  
  83.     DWORD WNetEnumResource( // https://msdn.microsoft.com/en-us/library/windows/desktop/aa385449.aspx
  84.  
  85.         HANDLE  hEnum,       // _In_
  86.  
  87.         LPDWORD lpcCount,    // _Inout_
  88.  
  89.         LPVOID  lpBuffer,    // _Out_
  90.  
  91.         LPDWORD lpBufferSize // _Inout_
  92.  
  93.     );
  94.  
  95.     DWORD WNetCloseEnum( HANDLE hEnum );
  96.  
  97. ]=]
  98.  
  99.  
  100.  
  101. local NetResource = ffi.new("NETRESOURCE")
  102.  
  103. local lpNetResource = ffi.cast("void*",NetResource)
  104.  
  105.  
  106.  
  107. local hEnum = ffi.new("HANDLE")
  108.  
  109. local lphEnum = ffi.cast("void*",hEnum)
  110.  
  111. --ShowErr( mpr.WNetOpenEnumW(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,0,lpNetResource,lphEnum) )
  112.  
  113. ShowErr( mpr.WNetOpenEnumW(RESOURCE_CONNECTED,RESOURCETYPE_DISK,0,ffi.NULL,lphEnum) )
  114.  
  115.  
  116.  
  117. -- тут мы будем вызывать WNetEnumResourceW
  118.  
  119.  
  120.  
  121. mpr.WNetCloseEnum(hEnum)
В чём может быть затык?
Разум когда-нибудь победит.

User avatar
DrKnS
Posts: 4535
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 113 times
Contact:

Удалённые Рабочие Столы и Локальные диски.

Post by DrKnS » Sat 25 Jun, 2016 17:29

local lphEnum = ffi.cast("void*",hEnum) - это каст (причём бесполезный), а не получение адреса.

Должно быть что-то типа:

Code: Select all

local hEnum = ffi.new("HANDLE[1]")
mpr.WNetOpenEnumW(RESOURCE_CONNECTED, RESOURCETYPE_DISK, 0, ffi.NULL, hEnum)
// use hEnum[0]

Post Reply

Return to “Предложения и идеи”

Who is online

Users browsing this forum: No registered users and 3 guests