Laden...

Freigabe Rechte auslesen

Erstellt von tt556789900 vor 14 Jahren Letzter Beitrag vor 14 Jahren 5.650 Views
T
tt556789900 Themenstarter:in
33 Beiträge seit 2008
vor 14 Jahren
Freigabe Rechte auslesen

Hallo zusammen,

ich möchte von einer lokalen Freigabe die Rechte ausgeben. Hab aber damit meine Probleme. Da ich im Internet zu Win32_Share fast nur C++ Beispiele finde, weiss ich leider nicht, ob meine Übergabeparameter stimmen. Kann auch sein das ich einen völlig falschen Ansatz betreibe....

        public void machwasdummes(string share, string name)
        {
            ManagementClass mc = new ManagementClass("Win32_Share");

            int type = 0; 
            object result = 0;
            try
            {
                result = mc.InvokeMethod("GetAccessMask", new Object[] { share, name, type });
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.WriteLine(result.ToString());
            Console.Read();
        }

Vorab schon einmal danke.

T
433 Beiträge seit 2006
vor 14 Jahren

Hallo Durrahan,

hier kannst du nachschauen wie es geht: http://dotnet-snippets.de/dns/freigaben-eines-remoterechners-auslesen-loeschen-SID642.aspx

Gruß,
Tom

T
tt556789900 Themenstarter:in
33 Beiträge seit 2008
vor 14 Jahren

Danke, hat mir geholfen.

T
tt556789900 Themenstarter:in
33 Beiträge seit 2008
vor 14 Jahren

Es funktioniert leider doch nicht...

ich hab mir mal das Codebeispiel aus dem Link zur Brust genommen und hab mir die Properties von dem ManagementObject share aufgelistet und da gibts eine Property mit dem Namen "AccessMask" Nur leider gibt die immer eine Nullexception aus, wird also nie gesetzt.

Dann hab ich mal weiter im Inet gestöbert und bin auf den Forumsbeitrag gestoßen:
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/e14bb1c9-e13e-4b7d-9ecc-41f2ec0fa0bf

Hier habe ich genau das Problem was der letzte Post von dem Thread auch aussagt, ich bekomme immer 0 zurück als Permission.

Kann mir da jemand weiterhelfen?

[Edit]Es scheint als würden alle an dem gleichen Problem hängen bleiben und keine Antwort finden: http://social.microsoft.com/Forums/en-US/Offtopic/thread/8866e014-7875-450a-855b-fb21728a52de[/Edit]

T
433 Beiträge seit 2006
vor 14 Jahren

Hi Durrahan,

hast du dir mal Win32_Share angeschaut?
Da heisst es das AccessMask obsolete ist und nur unter Windows NT 4.0 und Windows Me/98/95 etwas zurückliefert.

Probier mal die Methode GetAccessMask wie in den Community Beispielen angegeben.

Gruß,
Tom

T
tt556789900 Themenstarter:in
33 Beiträge seit 2008
vor 14 Jahren

Hab ich leider auch schon ausprobiert, da es leider nicht in dem Properties aufgelistet wird bringt es wie erwartet ein die ManagementException -> Nicht gefunden.

Hier die Auflistung der Properties:
[0] = "AccessMask"
[1] = "AllowMaximum"
[2] = "Caption"
[3] = "Description"
[4] = "InstallDate"
[5] = "MaximumAllowed"
[6] = "Name"
[7] = "Path"
[8] = "Status"
[9] = "Type"

Was ich auch noch komisch find, laut msdn bekommt man ja eine Zahl zurück, die angibt, was für ein Recht man darauf besitzt.

So, aber da es nur eine Zahl ist, kann es wohl schlecht eine Auflistung von Berechtigungen sein, da ja vll mehrere User drauf Zugriff haben, gibt der Wert nur der eigene Zugriff zurück?

T
433 Beiträge seit 2006
vor 14 Jahren

Das ist auch kein Property sondern eine Methode.

nutze einfach InvokeMethod("GetAccessMask", null).

Und was du genau zurück bekommst, solltest du aus der MSDN: GetAccessMask auslesen können.

Gruß,
Tom

T
tt556789900 Themenstarter:in
33 Beiträge seit 2008
vor 14 Jahren

So hat nun endlich funktioniert...
ich poste gleich noch meine Lösung.

[Edit]

Hier der volle Codesnippet:
http://dotnet-snippets.de/dns/freigaben-eines-remoterechners-auslesen-loeschen-SID642.aspx

Hab den Code jediglich um die Abfrage von GetAccessMask erweitert. Der Rückgabewert ist das Zugriffsrecht des daraufzugreifenden Users, zb greife ich auf den Share eines anderen Rechners zu und bekomme für meinen User das Zugriffsrecht.


ShareLister lister = new ShareLister();
List<ManagementObject> shares = lister.ListShares("PCName", "PCName" + @"\Administrator", "Passwort);
foreach (ManagementObject share in shares)
{
    Console.WriteLine(share["name"].ToString());
    object result = 0;
    try
    {
        result = share.InvokeMethod("GetAccessMask",null);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    Console.WriteLine(result.ToString());
}


    class ShareLister
    {
        public List<ManagementObject> ListShares(string computername, string username, string password)
        {
            List<ManagementObject> Shares = new List<ManagementObject>();
            if (computername != string.Empty)
            {
                ManagementScope managementScope1 = new ManagementScope((@"\\" + computername + @"\root\cimv2"));
                managementScope1.Options.Username = username;
                managementScope1.Options.Password = password;
                managementScope1.Options.EnablePrivileges = true;
                ObjectQuery objectQuery1 = new ObjectQuery("SELECT * FROM Win32_Share");
                ManagementObjectSearcher managementObjectSearcher1 = new ManagementObjectSearcher(managementScope1, objectQuery1);
                using (ManagementObjectCollection.ManagementObjectEnumerator managementObjectEnumerator1 =
                        managementObjectSearcher1.Get().GetEnumerator())
                {
                    while (managementObjectEnumerator1.MoveNext())
                    {
                        ManagementObject managementObject1 = ((ManagementObject)managementObjectEnumerator1.Current);
                        Shares.Add(managementObject1);
                    }
                }
            }
            return Shares;
        }

        public bool RemoveShare(ManagementObject shareToRemove)
        {
            try
            {
                shareToRemove.InvokeMethod("Delete", new object[] { shareToRemove.Path.ToString() });
                return true;
            }
            catch
            {
                return false;
            }
        }
    }

Häufig benutze Rückgabewerte:
2032127 Full Control
1245631 Change
1179817 Read

[/Edit]