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.
Hallo Durrahan,
hier kannst du nachschauen wie es geht: http://dotnet-snippets.de/dns/freigaben-eines-remoterechners-auslesen-loeschen-SID642.aspx
Gruß,
Tom
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]
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
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?
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
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]