Danke!
Ich habe es so gelöst, dass ich mit einem runas eine cmd aufrufe als der jeweilige benutzer. Dadurch wird ebenfalls ein Profilverzeichnis erstellt.
Hallo zusammen!
Es geht um folgende Vorgängen:
1.Es soll ein Benutzer angelegt werden
2.Nachdem der Benutzer angelegt wurde, soll ein shortcut auf seinem Desktop abgelegt werden
Gibt es eine Möglichkeit dies zu realisieren, ohne dass ich den Computer neu starten muss und mich als der entsprechende Benutzer anmelde?
Das anlegen des Benutzers mache ich so:
try{
PrincipalContext context = new PrincipalContext(ContextType.Machine);
UserPrincipal user = new UserPrincipal(context);
// Benutzer anlegen
user.SetPassword("senf");
user.DisplayName = "Schlumpf";
user.Name = "Klaus";
user.Description = "Beschreibung";
user.UserCannotChangePassword = false;
user.PasswordNeverExpires = false;
user.HomeDirectory = @"C:\Dokumente und Einstellungen\Klaus";
user.
user.Save();
// Benutzer zu Gruppe hinzufügen
GroupPrincipal group = GroupPrincipal.FindByIdentity(context, "Benutzer");
group.Members.Add(user);
group.Save();
// Benutzer zu weiterer Gruppe hinzufügen
group = GroupPrincipal.FindByIdentity(context, "Administratoren");
group.Members.Add(user);
group.Save();
}catch(Exception e){
Console.WriteLine(e);
}
Lege ich den Ordner nun einfach manuell an, wird bei der anmeldung des Benutzers einer Ordner "username.computername" angelegt.
Ich hoffe Ihr könnt mir helfen!
Gruß Piep000r
Es sieht nun so aus:
files = new List<string>();
folder = new List<string>();
int file_counter = 0;
int folder_counter = 0;
System.IO.DirectoryInfo ParentDirectory = new System.IO.DirectoryInfo(
@choice.Text);
DirectoryInfo di = new DirectoryInfo(@choice.Text);
foreach (var fn in di.GetFiles("*" ,SearchOption.AllDirectories)) {
files.Add(fn.ToString());
file_counter++;
}
MessageBox.Show("Es waren " + file_counter + " Dateien.","Debug");
foreach (var fn in di.GetDirectories("*" ,SearchOption.AllDirectories)) {
folder.Add(fn.ToString());
folder_counter++;
}
MessageBox.Show("Es waren " + folder_counter + " Ordner.","Debug");
}catch (Exception ex){
MessageBox.Show(ex.ToString(),"Exception");
}
Was jetzt natürlich noch brauchbar wäre, sind die vollen Pfade und nicht nur die Dateinamen.
Es funktioniert.
Habe das Framework benutzt.
Ich danke euch vielmals. =)
Hallo zusammen,
ich habe momentan das Problem, dass ich gerne alle Dateien und Unterordner mit deren Dateien und Unterordnern in eine Liste packen möchte (die pfadnamen als strings ablegen).
Dabei gehe ich von folgendem Code aus:
try {
files = new List<string>();
folder = new List<string>();
System.IO.DirectoryInfo ParentDirectory = new System.IO.DirectoryInfo(
@choice.Text);
//MessageBox.Show("tetst","Debug");
foreach (System.IO.FileInfo f in ParentDirectory.GetFiles())
{
MessageBox.Show("Datei: " + @choice.Text + "\\" + f.Name,"Dateiname:");
files.Add(@choice.Text + "\\" +f.Name);
}
foreach (System.IO.DirectoryInfo d in ParentDirectory.GetDirectories())
{
MessageBox.Show("Ordner: " + @choice.Text + "\\" + d.Name,"Ordnername");
folder.Add(@choice.Text + "\\" + d.Name);
}
}catch (Exception ex){
MessageBox.Show(ex.ToString(),"Exception");
}
Dieser kann jedoch leider nur alle Dateien und alle Ordner in einem Verzeichnis auflisten. Es werden also keine weiteren Unterordner und deren Dateien berücksichtigt.
Habt ihr vielleicht eine Idee, wie ich den Code abändern könnte um mein Ziel zu erreichen?
Vielen Dank und viele Grüße Piep000r!
Ich beschäftige mich nun auch intensiv mit diesem Thema. Seit Ihr da mitlerweile weitergekommen?
Ich sitze momentan an dem Problem, dass ich für Seagate die ID 194 auslese. Leider gibt mir diese immer den Wert 199 zurück.
Wenn ich mir in anderen Foren dazu etwas anschaue, dann sollte die Abfrage "SELECT * FROM MSStorageDriver_ATAPISmartData" doch eigentlich eine ganze tabelle mit mehreren spalten zurückgeben.
Liest man mit dem obigen Code wirklich die richtige Spalte ein, bzw. wie komme ich auf den Wert 199? Hat jemand einer Erklärung dafür?
Naja, mit icacls beispielsweise könnte man das machen. Lässt man dies als Admin laufen, kann man jedem beliebigen Benutzer die Datei zuweisen wie man lustig ist.
Ich wollte nur sehr ungerne den Weg gehen icacls über eine c# Anwendung anzustoßen. Das fand ich persönlich ein bisschen unschön.
Ich bekomme bei dem Versuch die Datei einem anderen Besitzer zuzuweisen folgende Exception:
Fehlermeldung:
System.InvalidOperationException: Die Sicherheits-ID darf nicht der Besitzer dieses Objekts sein.
@Abt: Kann ich diese TakeOwnershipPermission denn irgendwo vielleicht noch setzen?
Mein Programm sieht nun folgendermaßen aus:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Security.AccessControl;
namespace set_acls
{
class Program
{
static void Main(string[] args)
{
const string FILE = @"c:\temp\test.txt";
try
{
//string username = System.Security.Principal.Window
// aktuellen Besitzer einer Datei auslesen
var fs = File.GetAccessControl(FILE);
var sid = fs.GetOwner(typeof(SecurityIdentifier));
Console.WriteLine(sid);
var ntAccount = sid.Translate(typeof(NTAccount));
Console.WriteLine(ntAccount);
// neuen Besitzer einer Datei festlegen
var NTAccount = new NTAccount("Developer-PC","test");
var FileSecurity = new FileSecurity();
FileSecurity.SetOwner(NTAccount);
FileSecurity.AddAccessRule(new FileSystemAccessRule(NTAccount, FileSystemRights.FullControl, AccessControlType.Allow));
// fs.SetOwner(NTAccount);
File.SetAccessControl(FILE, FileSecurity);
Console.WriteLine("Besitzer erfolgreich geändert");
Console.ReadLine();
}
catch (Exception e) {
//Win32Exception w32exp = new Win32Exception();
//Console.WriteLine(w32exp);
/*
Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
*/
Console.WriteLine(e);
Console.ReadLine();
}
}
}
}
Und die Manifestdatei so:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- UAC-Manifestoptionen
Wenn Sie die Zugangsebene für das Windows-Benutzerkonto ändern möchten, ersetzen Sie den
requestedExecutionLevel-Knoten durch eines der folgenden Elemente.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
Durch Angeben des requestedExecutionLevel-Knotens wird die Datei- und Registrierungsvirtualisierung deaktiviert.
Wenn Sie Datei- und Registrierungsvirtualisierung für Abwärts-
kompatibilität verwenden möchten, löschen Sie den requestedExecutionLevel-Knoten.
-->
<!--requestedExecutionLevel level="asInvoker" uiAccess="false" /-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Eine Liste aller Windows-Versionen, mit denen die Anwendung kompatibel ist.
Windows wählt automatisch die am stärksten kompatible Umgebung aus.-->
<!-- Wenn die Anwendung mit Windows Vista kompatibel ist, heben Sie die Auskommentierung des folgenden supportedOS-Knotens auf-->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS>-->
<!-- Wenn die Anwendung mit Windows 7 kompatibel ist, heben Sie die Kommentierung des folgenden supportedOS-Knotens auf.-->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>-->
<!-- Wenn die Anwendung mit Windows 8 kompatibel ist, heben Sie die Auskommentierung des folgenden supportedOS-Knotens auf-->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"></supportedOS>-->
</application>
</compatibility>
<!-- Designs für allgemeine Windows-Steuerelemente und -Dialogfelder (Windows XP und höher) aktivieren -->
<!-- <dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>-->
</asmv1:assembly>
Jedoch hat sich leider an dem Problem nichts geändert
Vielen Dank für Deine Hilfe gfoidl!
Ich habe es nun wie hier gemacht:
How to force my .NET App to run as administrator on Windows 7
Also eine Manifestdatei erstellt und meine Anwendung laufen lassen.
Jedoch macht das Programm noch nicht ganz das was ich mir vorgestellt habe.
Ich kann nur als aktuell angemeldeter Benutzer den Besitz der Datei übernehmen. Aber nicht einfach einen beliebigen Benutzer als Besitzer zuweisen.
Gibts da ein Workaround um mich während ich dieses Programm als User x ausführe für den Teil der Besitzübernahme als User y auszugeben?
Oder habt Ihr vielleicht noch ein bessere Idee?
Genau!
Von Dort habe ich den Großteil meines Programms.
Jedoch Funktioniert es nicht.
Ich bekomme folgende Ausgabe (siehe Bild)!
Mir ist an der Stelle unklar, wieso ich einen nicht autorisierten Vorgang ausführe, denn mein Benutzerkonto ist ein Administrator!
Hat da vielleicht einer eine Idee warum dieser Fehler entsteht?
Hallo, ich möchte gerne ein kleines Tool schreiben mit dem ich unter anderem den Besitzer einer Datei neu setzen kann (SetOwner).
Ich habe bisher den folgenden Ansatz. Allerdings übernimmt er die Einstellungen über den Besitzer leider nicht.
Geht das so überhaupt? Ich habe das Programm auch schon als lokaler Administrator ausgeführt. Jedoch brachte dies auch nicht den gewünschten Erfolg (fehlende Berechtigung).
Lässt Windows meine Idee in der Form überhaupt zu?
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
namespace set_acls
{
class Program
{
static void Main(string[] args)
{
string FILE = @"c:\temp\test.txt";
try
{
// aktuellen Besitzer einer Datei auslesen
var fs = File.GetAccessControl(FILE);
var sid = fs.GetOwner(typeof(SecurityIdentifier));
Console.WriteLine(sid);
var ntAccount = sid.Translate(typeof(NTAccount));
Console.WriteLine(ntAccount);
// neuen Besitzer einer Datei festlegen
var NTAccount = new NTAccount("Developer-PC","test");
fs.SetOwner(NTAccount);
File.SetAccessControl(FILE, fs);
Console.WriteLine("Besitzer erfolgreich geändert");
Console.ReadLine();
}
catch (Exception e) {
Win32Exception w32exp = new Win32Exception();
Console.WriteLine(w32exp);
Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine(e);
Console.ReadLine();
}
}
}
}