Как я могу узнать, к каким общим папкам имеет доступ моя программа?

StackOverflow https://stackoverflow.com/questions/4690227

  •  11-10-2019
  •  | 
  •  

Вопрос

Моей программе необходимо выполнять чтение и запись в папки на других компьютерах, которые могут находиться в другом домене.Поэтому я использовал System.Runtime.Службы взаимодействия для добавления общих папок.Это работало нормально, когда было жестко запрограммировано в главном меню моей службы Windows.Но с тех пор что-то пошло не так, и я не знаю, ошибка ли это кодирования или конфигурации.

  • Какова область действия общей папки?Если поток в моей программе добавит общую папку, сможет ли ее увидеть весь локальный компьютер?
  • Есть ли способ просмотреть, какие общие папки были добавлены?Или есть способ узнать, когда добавляется папка?

    [DllImport("NetApi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    internal static extern System.UInt32 NetUseAdd(string UncServerName, int Level, ref USE_INFO_2 Buf, out uint ParmError);
    
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    internal struct USE_INFO_2
    {
        internal LPWSTR ui2_local;
        internal LPWSTR ui2_remote;
        internal LPWSTR ui2_password;
        internal DWORD ui2_status;
        internal DWORD ui2_asg_type;
        internal DWORD ui2_refcount;
        internal DWORD ui2_usecount;
        internal LPWSTR ui2_username;
        internal LPWSTR ui2_domainname;
    }
    
    private void AddSharedFolder(string name, string domain, string username, string password)
    {
        if (name == null || domain == null || username == null || password == null)
            return;
    
        USE_INFO_2 useInfo = new USE_INFO_2();
        useInfo.ui2_remote = name;
        useInfo.ui2_password = password;
        useInfo.ui2_asg_type = 0;    //disk drive
        useInfo.ui2_usecount = 1;
        useInfo.ui2_username = username;
        useInfo.ui2_domainname = domain;
        uint paramErrorIndex;
        uint returnCode = NetUseAdd(String.Empty, 2, ref useInfo, out paramErrorIndex);
        if (returnCode != 0)
        {
            throw new Win32Exception((int)returnCode);
        }
    }
    
Это было полезно?

Решение

Каждый поток на компьютере выполняется под определенной учетной записью пользователя.Общая папка имеет настройки безопасности, т.е.на них распространяется контроль доступа на основе ACL, так что некоторые пользователи могут иметь разрешение на доступ, а другие - нет.Это означает, что поток в вашей программе может быть способен "видеть" некоторые общие папки, в то время как другие потоки на том же компьютере (включая интерактивного пользователя, использующего рабочий стол) могут быть не в состоянии "видеть" эти папки.

Подводя итог:вы должны предполагать очень немногое.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top