Как узнать, к каким папкам общего доступа имеет доступ моя программа? - PullRequest
0 голосов
/ 14 января 2011

Моя программа должна читать и записывать в папки на других компьютерах, которые могут находиться в другом домене. Поэтому я использовал System.Runtime.InteropServices для добавления общих папок. Это работало нормально, когда оно было жестко запрограммировано в главном меню моей службы 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);
        }
    }
    

1 Ответ

1 голос
/ 14 января 2011

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

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

...