Zugriff verweigert kommt nur manchmal, beim zweiten CLEAN klappt es.
Ich möchte in einem Programm ermitteln, ob das Programm unter Windows 10 oder 11 (besser in welchem Windows XP, 7, 8.1. 10, 11) läuft.
Das Programm mache ich mit C# unter VS2022.
Es geht eigentlich ganz einfach mit
string description = RuntimeInformation.OSDescription;
Hier die Ergebnisse:
Windows 10 liefert ⇒ Microsoft Windows 10.0.19045 <= Build
Windows 11 liefert ⇒ Microsoft Windows 10.0.22621 <= Build
Muss man nun abfragen ; Build > 22000 = Win11, ansonsten Win10 ?
Ich vermute, dass der Defender der Blockierer ist.
Bei Win10 und 11 benutze ich jeweils nur den Defender als Virenschutz.
Offenbar arbeiten diese Programme bei Win10 und 11 nicht gleich.
Im abgesicherten Modus ist der Defender nicht aktiv.
Und das passiert bei Windows 10:
Microsoft DiskPart-Version 10.0.19041.964
Copyright (C) Microsoft Corporation.
Auf Computer: R980
DISKPART> list disk
Datenträger ### Status Größe Frei Dyn GPT
--------------- ------------- ------- ------- --- ---
Datenträger 0 Online 2794 GB 1024 KB *
Datenträger 1 Online 1863 GB 1024 KB *
Datenträger 2 Online 5589 GB 0 B *
Datenträger 3 Online 931 GB 1024 KB *
Datenträger 4 Online 931 GB 1024 KB *
Datenträger 5 Online 931 GB 1024 KB *
Datenträger 6 Online 960 MB 0 B
DISKPART> select disk 6
Datenträger 6 ist jetzt der gewählte Datenträger.
DISKPART> attributes disk
Aktueller schreibgeschützter Zustand: Nein
Schreibgeschützt : Nein
Startdatenträger : Nein
Auslagerungsdatei-Datenträger : Nein
Ruhezustandsdatei-Datenträger : Nein
Absturzabbild-Datenträger : Nein
Clusterdatenträger : Nein
DISKPART> clean
Der Datenträger wurde bereinigt.
DISKPART> attributes disk
Aktueller schreibgeschützter Zustand: Nein
Schreibgeschützt : Nein
Startdatenträger : Nein
Auslagerungsdatei-Datenträger : Nein
Ruhezustandsdatei-Datenträger : Nein
Absturzabbild-Datenträger : Nein
Clusterdatenträger : Nein
DISKPART>
So sieht es bei Windows 11 aus:
Microsoft DiskPart-Version 10.0.22621.1
Copyright (C) Microsoft Corporation.
Auf Computer: R980
DISKPART> list disk
Datenträger ### Status Größe Frei Dyn GPT
--------------- ------------- ------- ------- --- ---
Datenträger 0 Online 2794 GB 1024 KB *
Datenträger 1 Online 1863 GB 1024 KB *
Datenträger 2 Online 5589 GB 0 B *
Datenträger 3 Online 931 GB 1024 KB *
Datenträger 4 Online 931 GB 1024 KB *
Datenträger 5 Online 931 GB 1024 KB *
Datenträger 6 Online 960 MB 944 MB
DISKPART> select disk 6
Datenträger 6 ist jetzt der gewählte Datenträger.
DISKPART> attributes disk
Aktueller schreibgeschützter Zustand: Nein
Schreibgeschützt : Nein
Startdatenträger : Nein
Auslagerungsdatei-Datenträger : Nein
Ruhezustandsdatei-Datenträger : Nein
Absturzabbild-Datenträger : Nein
Clusterdatenträger : Nein
DISKPART> clean
Fehler in DiskPart: Zugriff verweigert
Weitere Informationen finden Sie im Systemereignisprotokoll.
DISKPART> clean
Der Datenträger wurde bereinigt.
DISKPART> attributes disk
Aktueller schreibgeschützter Zustand: Nein
Schreibgeschützt : Nein
Startdatenträger : Nein
Auslagerungsdatei-Datenträger : Nein
Ruhezustandsdatei-Datenträger : Nein
Absturzabbild-Datenträger : Nein
Clusterdatenträger : Nein
DISKPART>
Wenn ich eine byte[] Array auf ein USB-PhysicalDrive ausgeben will, dann bekomme ich von WIndows 10 den Fehler "Der Zugriff auf den Pfad wurde verweigert.". Unter Windows 11 auf dem gleichen PC funktioniert es ohne diesen Fehler. Bei Win10 klappt es auch im abgesicherten Modus.
Ich muss das USB-Gerät (USB-Stick oder SD-Card im CardReader) zuvor mit DiskPart-CLEAN löschen
und mein Programm bzw. VS2022 mit "Als Administrator ausführen" starten.
So sieht das Ergebnis bei WIndows 10 aus:
<CreateFile> des USB-Laufwerkes "\\.\PhysicalDrive6" = OK
<DeviceIoControl FSCTL_LOCK_VOLUME> OK
<DeviceIoControl FSCTL_DISMOUNT_VOLUME> OK
<FileStream(h, FileAccess.Write> OK
<outPutFile.Write> bei Offset 0x0000000000 von Ges = 0x0000F50000
Fehler bei <write>
~~~~~~~~~~~~~~~~<Exception-Anfang>~~~~~~~~~~~~~~~~~~~~~~
System.UnauthorizedAccessException: Der Zugriff auf den Pfad wurde verweigert.
bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
bei System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count)
bei System.IO.FileStream.Write(Byte[] array, Int32 offset, Int32 count)
bei HkDiskette.Form1.WriteUsb2() in V:\#PgmHK\VC20xx\HKcs\HkDiskette\Form1.cs:Zeile 2380.
~~~~~~~~~~~~~~~~~<Exception-Ende>~~~~~~~~~~~~~~~~~~~~~~~
Und so bei Windows 11
<CreateFile> des USB-Laufwerkes "\\.\PhysicalDrive6" = OK
<DeviceIoControl FSCTL_LOCK_VOLUME> OK
<DeviceIoControl FSCTL_DISMOUNT_VOLUME> OK
<FileStream(h, FileAccess.Write> OK
<outPutFile.Write> bei Offset 0x0000000000 von Ges = 0x0000F50000
DeviceIoControl FSCTL_UNLOCK_VOLUME = OK
"\\.\PhysicalDrive6" 0x80070000: handle closed.
Ausgabe fertig
Hier etwas Code
//#####################################
// USB ausgeben TEST (2)
//#####################################
private void WriteUsb2()
{
string deviceId = @"\\.\PhysicalDrive6";
string DsnEing = @"G:\Test\USB\CF16MB-CARDupd.vhd";
int intOut = 0;
int MaxLenPu = 0x7FFFFE00;
FileInfo f = new FileInfo(DsnEing);
if (!f.Exists)
{
PutLst("Datei " + DsnEing + " existiert nicht\n=> Abbruch");
return;
}
long LenEing = f.Length;
if (DsnEing.ToLower().EndsWith(".vhd"))
{
LenEing -= 512; // Ohne den Fuss-Sektor
}
int LenPu = (int)Math.Min(LenEing, MaxLenPu);
long RestLen = LenEing;
SafeFileHandle h = CreateFile(deviceId, GENERIC_READ | GENERIC_WRITE, 0,
IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
if (h.IsInvalid)
{
PutLst("Fehler <IsInvalid == true> bei <CreateFile> des USB-Laufwerkes \"" + deviceId + "\"");
return;
}
PutLst("<CreateFile> des USB-Laufwerkes \""+ deviceId + "\" = OK");
if (!DeviceIoControl(h, FSCTL_LOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero))
{
PutLst("Fehler DeviceIoControl FSCTL_LOCK_VOLUME");
CloseHandle(h);
return;
}
PutLst("<DeviceIoControl FSCTL_LOCK_VOLUME> OK");
if (!DeviceIoControl(h, FSCTL_DISMOUNT_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero))
{
PutLst("Fehler DeviceIoControl FSCTL_DISMOUNT_VOLUME");
CloseHandle(h);
return;
}
PutLst("<DeviceIoControl FSCTL_DISMOUNT_VOLUME> OK");
Stream outPutFile = new FileStream(h, FileAccess.Write);
PutLst("<FileStream(h, FileAccess.Write> OK");
byte[] ByPu = null;
int Gelesen = 0;
long LenAusg = 0;
using (FileStream ReadVHD = new FileStream(DsnEing, FileMode.Open, FileAccess.Read,
FileShare.Read, 4096, FileOptions.SequentialScan))
{
while (RestLen > 0)
{
long LeseLen = Math.Min(RestLen, LenPu);
ByPu = new byte[LeseLen];
try
{
Gelesen = ReadVHD.Read(ByPu, 0, (int)LeseLen);
}
catch (Exception ex)
{
PutLst("Fehler beim Lesen der Datei \"" + DsnEing + "\"");
PutLst("~~~~~~~~~~~~~~~~<Exception-Anfang>~~~~~~~~~~~~~~~~~~~~~~");
PutLst(ex.ToString());
PutLst("~~~~~~~~~~~~~~~~~<Exception-Ende>~~~~~~~~~~~~~~~~~~~~~~~");
return;
}
if (Gelesen != LeseLen) break; // => EOF erreicht
try
{
PutLst("<outPutFile.Write> bei Offset 0x" + LenAusg.ToString("X10")+
" von Ges = 0x"+LenEing.ToString("X10"));
outPutFile.Write(ByPu, 0, (int)LeseLen);
LenAusg += LeseLen;
laDiskLw.Text = EdLong(LenAusg, 14) + " / " + EdLong(LenEing, 14) +
" Bytes ausgegeben.";
RestLen -= LeseLen;
Application.DoEvents();
}
catch (Exception ex)
{
PutLst("");
PutLst("Fehler bei <write>");
PutLst("~~~~~~~~~~~~~~~~<Exception-Anfang>~~~~~~~~~~~~~~~~~~~~~~");
PutLst(ex.ToString());
PutLst("~~~~~~~~~~~~~~~~~<Exception-Ende>~~~~~~~~~~~~~~~~~~~~~~~");
return;
}
} // while(RestLen > 0)
} // using (FileStream ReadVHD
if (!DeviceIoControl(h, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero))
{ PutLst("Fehler DeviceIoControl FSCTL_UNLOCK_VOLUME"); return; }
PutLst("DeviceIoControl FSCTL_UNLOCK_VOLUME = OK");
if (!CloseHandle(h))
{
PutLst("\"" + deviceId + "\" 0x" + Marshal.GetHRForLastWin32Error().ToString("X8") + ": close handle error: " +
Marshal.GetHRForLastWin32Error().ToString("X8"));
return;
}
PutLst("\"" + deviceId + "\" 0x" + Marshal.GetHRForLastWin32Error().ToString("X8") + ": handle closed.");
PutLst("Ausgabe fertig");
} // private void WriteUsb2()