C# Windows Dienst: Probleme mit Netzlaufwerken

Zhen

Lt. Junior Grade
Registriert
Aug. 2009
Beiträge
299
Hallo Leute,
hab da ein kleines Problemchen :D

Ich hab nen Windows-Dienst geschrieben, dieser funktioniert auch soweit einwandfrei. Sogar die Gui dafür Läuft (extra Programm um Einstellungen vom Dienst ändern zu können).

Aber irgendwie kann ich keine Netzlaufwerke mit der Methode "DriveInfo.GetAllDrives()" erfassen. Ich brauch halt die Namen und die Größen von denen. Lokale Partitionen und Laufwerke gehen, aber keine Netzlaufwerke.

Wenn ich die Methode jedoch in nem Konsolen-Programm ausführe kann ich die Netzlaufwerke auch erfassen.

Hab bereits mit LocalSystem Account probiert, mit User-Account probiert beides das selbe. Unter Network Account hab ich das Problem, dass er mir beim Starten ne Fehlermeldung ausspuckt "Kein Zugriff" oder so.

Jemand ne Idee woran das liegen könnte? Kann es sein, dass iwie noch ein Passwort unter Network-Account oder sonstiges angeben muss?
 
Hi,

System.IO.DriveInfo[] allDrives = System.IO.DriveInfo.GetDrives();

Hast du die Methode schonmal getestet? GetDrives statt GetAllDrives?

Quelle

Oder mal per WMI probiert?

Quelle

VG,
Mad
 
Zuletzt bearbeitet:
sorry hab mich vertan, die Methode heißt schon GetDrives() :D
Ergänzung ()

was ich halt nicht verstehe ist wieso ich den Service unter dem Netzwerk Account nicht starten kann... wieso da diese Meldung dann auftaucht.
 
Fehlermeldung:

Der Dienst "meinDienst" auf "Lokaler Computer" konnte nicht gestartet werden.
Fehler 5: Zugriff verweigert
 
Hi,

Hab bereits mit LocalSystem Account probiert, mit User-Account probiert beides das selbe.

Heißt das, wenn du "ausführen als" bei dem Dienst festlegst und da einen User-Account verwendest geht es?

Wie genau gehts du vor, um den Dienst zu starten / Installieren?

VG,
Mad
 
Ein Netzlaufwerk ist nur unter dem aktuell angemeldeten Benutzer vorhanden.
 
Also,
du hast gleich mehrere Probleme.

1. Netzlaufwerke existieren nicht "global", zumindest nicht "by default". In der Regel sind die an ein Useraccount gekoppelt. In einer Domäne inkl. entsprechender Gruppenrichtlinien kann das anders aussehen.

2. Du hast keinen blassen Schimmer von den verschiedenen Service-Accounts :) Vlt. einfach mal einen Blick ins MSDN werfen oder zumindest die 2 Zeilen Text im IntelliSense lesen.

  • User Accounts
    Domain User Account
    If the service must interact with network services, access domain resources like file shares or if it uses linked server connections to other computers running SQL Server, you might use a minimally-privileged domain account. Many server-to-server activities can be performed only with a domain user account. This account should be pre-created by domain administration in your environment.

    Local User Account
    If the computer is not part of a domain, a local user account without Windows administrator permissions is recommended.

  • Local System Account
    Local System is a very high-privileged built-in account. It has extensive privileges on the local system and acts as the computer on the network. The actual name of the account is "NT AUTHORITY\SYSTEM".

  • Local Service Account
    The Local Service account is a built-in account that has the same level of access to resources and objects as members of the Users group. This limited access helps safeguard the system if individual services or processes are compromised. Services that run as the
    Local Service account access network resources as a null session without credentials.
    Be aware that the Local Service account is not supported for the SQL Server or SQL Server Agent services. The actual name of the account is "NT AUTHORITY\LOCAL SERVICE".

  • Network Service Account
    The Network Service account is a built-in account that has more access to resources and objects than members of the Users group. Services that run as the Network Service account access network resources by using the credentials of the computer account. The actual name of the account is "NT AUTHORITY\NETWORK SERVICE"
 
Nein es ist so. Ich habe mein Visual Studio Projekt (den Windows Dienst). Hier ist ja dieser Installer Klasse wo man dann den Account (unter dem der Dienst ausgeführt wird) angeben muss.

serviceProcessInstaller.Account = ServiceAccount.NetworkService;

Wenn ich die obere Zeile so lasse, den Dienst über "installutil.exe /i meindienst.exe" installiere, dann unter verwaltung -> dienste gehe, rechtsklick auf meinen dienst und dann "starten" auswähle... spuckt er mir die Fehlermeldung von oben aus.


Ändere ich jedoch die obere Zeile in:

serviceProcessInstaller.Account = ServiceAccount.LocalSystem;

und führe die anderen Schritte so aus wie schon beschrieben, dann kommt KEINE Fehlermeldung, der Dienst funktioniert auch super, ABER er gibt mir nur lokale Laufwerke und Partitionen wieder (keine Netzlaufwerke). Genau das selbe passiert wenn ich die Zeile so ändere:

serviceProcessInstaller.Account = ServiceAccount.User;
serviceProcessInstaller.Username = "username";
serviceProcessInstaller.Password = "passwort";


wenn ich die Netzlaufwerk-Informationen nicht so dringend bräuchte, dann wärs mir ja egal. Aber ich brauch die eben. Deswegen muss ich den Dienst so zum laufen bringen, dass er mir auch die Infos von den Netzlaufwerken ausspuckt!
Ergänzung ()

Die IntelliSense hab ich schon gelesen :D

PS: der Dienst soll später eh auf einem Server laufen, aber da installier ich den nicht rauf bevor ich den nicht wenigstens lokal hier zum laufen bringe xDD

EDIT: daran dass die netzlaufwerke nur unter dem user vorhanden sind hab ich gar nicht nachgedacht
 
Zuletzt bearbeitet:
Zhen schrieb:
serviceProcessInstaller.Account = ServiceAccount.LocalSystem;

Diesen Account solltest du nur verwenden, wenn es wirklich nicht anders geht. Im Gegensatz zum Administrator-Account, hat dieser Account null Sperren.
 
Network Account ist auch was anderes, das brauchst du als Account für deinen Dienst gar nicht versuchen.

2 Probleme die ich an deiner Sache sehe:

1. Wenn du LocalSystem als Account verwendest, dann stehen diesem die unter deinem User gemappten Laufwerke logischerweise nicht zur Verfügung. Diese sind nur in deiner Usersession verfügbar, nicht ausserhalb. LocalSystem hat zudem mit ziemlicher Sicherheit im default nicht die Rechte aufs Netzwerk zuzugreifen. Du müsstest dem Account LocalSystem also das Recht geben aufs Netzwerk zuzugreifen. Die Freigaben auf die du zugreifst um den freien Speicher auszulesen, also etwa C$ müssen dann für diesen User auch berechtigt sein.

2. Wenn du deinen persönlichen AdminAccount in die Dienste Konsole einträgst, dann bekommst du zum einen Probleme wenn du mal dein Passwort wechselst, denn in der Dienste MMC ist ja immernoch das alte Passwort eingetragen. Das größere Problem aber ist das der Dienst beim Booten gestartet wird in deinem Account, bevor vom Explorer Prozess die Netzlaufwerke verbunden werden. Du hast hier also ein Timing Problem. Zudem funktioniert der Dienst nur dann, wenn du mit dem selben User aktiv angemeldet bist und die Laufwerke gemappt hast.



Zhen schrieb:
Wenn ich die Methode jedoch in nem Konsolen-Programm ausführe kann ich die Netzlaufwerke auch erfassen.

Logisch. Dein Code im Dienst ist schon korrekt. Es funktioniert weil das Programm im Userkontext ausgeführt wird, in dessen Kontext auch die Netzlaufwerke bereits gemappt sind. Da hast du das Timing Problem, wie in Problem 2, nicht.



Wie die Lösung aussieht hängt davon ab, ob du Problem 1 oder 2 beseitigen willst. Sprich dein Dienst als LocalSystem oder im Userkontext laufen soll.

Wenn du schreibst dass dein Dienst dauerhaft auf einem Server laufen soll, dann kommt nur LocalSystem als Account in Frage.

Oder aber du legst einen extra Benutzer an, den du in der Domäne als domänenlokaler Adminuser berechtigst und diesen dann für deinen Service verwendest. Dann hätte er pauschal auf alle administrative Freigaben eurer Clients bereits Zugriff.
 
Zuletzt bearbeitet:
Ich würd das Programm als Autostart-Anwendung implementieren, die auf alle Netzlaufwerke zugreifen kann, die der angemeldete Benutzer konfiguriert hat.
Falls es wirklich ein Dienst sein muss, würde ich ihn so ändern, dass mit dem Konfigurationsprogramm, das du ja schon hast, direkt die Freigaben eingestellt werden können, die überwacht werden sollen (also keine Laufwerksbuchstaben).
 
Danke für die ganzen Infos und die Tipps. Ich bin noch am überlegen was am sinnvollsten/besten ist... werde mich nochmal melden.

Jetzt erstmal überlegen was tun :D
Ergänzung ()

Ok nochmals vielen Dank für die Infos, mir wäre wohl echt nicht so schnell eingefallen, dass die Netzlaufwerke ja Userbezogen verbunden werden... :D

Hab mich jetzt dazu entschlossen die doch raußzukicken. Die wahrscheinlichkeit, dass bei nem Server ein Netzlaufwerk verbunden ist, ist sowieso sehr gering ^^

Dann hat sich das Thema erledigt :)
 
Zurück
Oben