2011-01-14 7 views
0

Mein Programm muss in Ordner auf anderen Computern lesen und schreiben, die sich möglicherweise in einer anderen Domäne befinden. Also habe ich die System.Runtime.InteropServices verwendet, um freigegebene Ordner hinzuzufügen. Dies funktionierte gut, als es im Hauptmenü meines Windows-Dienstes fest codiert war. Aber seitdem ist etwas schief gelaufen und ich weiß nicht, ob es ein Codierungsfehler oder ein Konfigurationsfehler ist.Wie kann ich sehen, auf welche freigegebenen Ordner mein Programm zugreifen kann?

  • Was ist der Umfang eines freigegebenen Ordners? Wenn ein Thread in meinem Programm einen freigegebenen Ordner hinzufügt, kann der gesamte lokale Computer es sehen?
  • Gibt es eine Möglichkeit zu sehen, welche freigegebenen Ordner hinzugefügt wurde? Oder gibt es eine Möglichkeit zu sehen, wenn ein Ordner hinzugefügt wird?

    [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); 
        } 
    } 
    

Antwort

1

Jeder Thread in einem Computer läuft unter einem bestimmten Benutzerkonto. Freigegebene Ordner verfügen über Sicherheitseinstellungen, d. H. Sie unterliegen der ACL-basierten Zugriffssteuerung, sodass einige Benutzer Zugriffsrechte haben und andere nicht. Dies bedeutet, dass der Thread in Ihrem Programm möglicherweise einige freigegebene Ordner "sehen" kann, während andere Threads auf demselben Computer (einschließlich des interaktiven Benutzers, der den Desktop verwendet) diese Ordner möglicherweise nicht "sehen" können.

Zusammenfassend: Sie sollten sehr wenig annehmen.

+0

Danke. Ich habe das Problem gelöst, was darin zu liegen scheint, dass das Programm einen Teil der Konfigurationsdatei nicht richtig gelesen hat. –