I NT/2000/XP kan du köra "cmd /c kommandot".
I andra versioner kan det fungera om du byter ut cmd mot command. Tänk på att de kommandon som finns skiljer sig mellan operativsystemen.
36 svar · 1 164 visningar · startad av aleborg
Jag vill köra ett kommando via dosprompten från ett program i C#, någon som vet hur man gör detta?
I NT/2000/XP kan du köra "cmd /c kommandot".
I andra versioner kan det fungera om du byter ut cmd mot command. Tänk på att de kommandon som finns skiljer sig mellan operativsystemen.
men hur gör man det via C#?
jag ska köra ett kommando direkt i från koden...
Det beror lite på vad du vill göra. Vill du bara slänga iväg kommandot i en egen tråd/process utan att bry dig om resultatet/outputen så duger det väl med interop + CreateProcess eller ShellExecute.
Annars: http://www.experts-exchange.com/Programming/Programming_Languages/C_Sharp/Q_20656555.html
Det jag ska göra är att sätta rättigheter på filer o mappar mha calc, hittar tyvärr inget annat smidigt sätt att göra det på :(
Vet inte om den returnerar nått...
Calc? cacls, menar du? Men, oavsett vilket så kan du väl använda koden i länken ovan och ändra värdena på UseShellExecute och RedirectStandardOutput ifall du inte är intresserad av returvärdena/outputen? Det förenklar ju koden avsevärt.
Japp det menar jag, tack :)
Du vet inget bättre sätt att ändra fil/mapp rättigheter på?
En variant är att använda DllImport och köra på de gamla vanliga Win32-API:erna: SetFileSecurity, GetFileSecurity osv ..
Sen finns det tydligen möjligheter även via System.DirectoryServices i Frameworken.
Fast det är nog svårt att påstå att nån av dem är enklare än att bara "shella" cacls.exe.
cacls.exe kan missa i bland har jag märkt!
DllImport låter intressant, har du mer info om det?
System.DirectoryServices kan inte sätta för ett speciellt konto vad jag har kunnat se efter ganska mycket efterforskningar i det!
det jag behöver är en klass som man kan skicka in vilket konto som ska ha rättigheter på en viss mapp/fil samt vilka rättigheter. Typ
SetPermissions.User="MittKonto";
SetPermissions.Path=@"C:\www\minmapp";
SetPermissions.Read=true;
SetPermissions.Write=true;
SetPermissions.Execute=false;
eller nått sånt :D
aleborg skrev:
DllImport låter intressant, har du mer info om det?
Ja, alltså DllImport används ju bara för att länka in de gamla "native" API:erna som SetFileSecurity osv .. Fast det är en jäkla massa mek och all exempelkod du hittar kommer att vara i C++/VB.
aleborg skrev:
System.DirectoryServices kan inte sätta för ett speciellt konto vad jag har kunnat se efter ganska mycket efterforskningar i det!
OK. Det visste jag inte. Jag uppfattade att ASPNET bara användes som ett exempel i länken ovan.
Men annars: Har du kollat på den här?
tack, såg nu att det gick med importen av Active DS Type Library utan den verkar det inte gå vad jag sett iaf, men jag kan ha fel :e
Sitter nu med den här koden:
ADsSecurityUtilityClass secuUtil = new ADsSecurityUtilityClass();
object ob = secuUtil.GetSecurityDescriptor(strFile,(int)ActiveDs.ADS_PATHTYPE_ENUM.ADS_PATH_FILE,(int)ActiveDs.ADS_SD_FORMAT_ENUM.ADS_SD_FORMAT_IID);
if (null != ob)
{
ActiveDs.IADsSecurityDescriptor sd = (IADsSecurityDescriptor)ob;
ActiveDs.IADsAccessControlList obDacl = (ActiveDs.IADsAccessControlList)sd.DiscretionaryAcl;
bool bAddAce = true;
IEnumerator obAceEnum = obDacl.GetEnumerator();
while (obAceEnum.MoveNext())
{
IADsAccessControlEntry obAce = (IADsAccessControlEntry)obAceEnum.Current;
// Check if "ASPNET" account is trustee of ACE or not.
if (obAce.Trustee.IndexOf(user) != -1)
{
// Check if this is a ALOWED Ace or not.
if (obAce.AceType == (int)ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED)
{
bAddAce = false;
}
}
}
// If bAddAce flag is set, then we will add it.
if (bAddAce)
{
AccessControlEntryClass obNewAce = new AccessControlEntryClass();
obNewAce.AceType = (int)ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED;
obNewAce.Trustee = @user;
obNewAce.AccessMask = -1;
obDacl.AddAce(obNewAce);
sd.DiscretionaryAcl = obDacl;
secuUtil.SetSecurityDescriptor(strFile,(int)ADS_PATHTYPE_ENUM.ADS_PATH_FILE,sd,(int)ADS_SD_FORMAT_ENUM.ADS_SD_FORMAT_IID);
}
på filer sätter den fulla rättigheter och mappar så läggs den till men rättigheterna syns bara i avancerade delen och där har den fulla.
Någon som kan hjälpa mig ändra så att den sätter "modify" rättigheter på mappar och filer eller bara "read"?
Hmm .. Måste man sitta på en domänkontrollant för att kunna kompilera? Min Active DS Type Library verkar iaf inte innehålla hälften av vad som behövs.
Men i vilket fall som helst så rekommenderar jag fortfarande att du kollar på den här. Den innehåller en funktion TestSetFileSec i TestClass.cs som är precis vad du behöver (jag har testat).
static void TestSetFileSec ()
{
string filename = @"f:\a.txt";
SecurityDescriptor secDesc = SecurityDescriptor.GetFileSecurity (filename, SECURITY_INFORMATION.DACL_SECURITY_INFORMATION);
Dacl dacl = secDesc.Dacl;
dacl.AddAce (new AceAccessAllowed (new Sid ("dator\\användare"), AccessType.GENERIC_WRITE|AccessType.GENERIC_READ));
secDesc.SetDacl(dacl);
secDesc.SetFileSecurity(filename, SECURITY_INFORMATION.DACL_SECURITY_INFORMATION);
}
Tips:
1. Packa upp projektet.
2. Dra igång WhoIsProc.sln i toppmappen.
3. "Remova" direkt WhoIsProc och WhoIsProcUI från projektet. Annars får du problem. (Jag fick det iaf.)
4. Högerklicka på TestSecurity och sätt som "Start up project".
Men hur ska jag använda den från min egna applikation? Det räcker inte med att göra en referens till DLL-filen iaf!
(102): 'SecurityDescriptor' is an ambiguous reference
Det räcker inte med att göra en referens till DLL-filen iaf!
Jo? Det funkar utmärkt hos mig bara man lägger till:
using System.Runtime.InteropServices;
using Microsoft.Win32.Security;
(102): 'SecurityDescriptor' is an ambiguous reference
Fast det måste väl bero på en konflikt med en annan referens? Active DS Type Library tex? Antingen tar du bort den eller så kör du på fullständiga namn genomgående:
Microsoft.Win32.Security.SecurityDescriptor
osv ..
Nu så funkar det :D
Men det är mysko inställningar för rättigheterna, det är bara "speciella" rättigheter och om man sätter på en mapp så ärvs det inte "Traverse folder / Execute file" måste kryssas i samt "Apply onto: This folder, subfolders and files" men det verkar omöjligt :(
Ja, du .. Nu har jag inte fördjupat mig så mycket och dokumentationen är obefintlig, men jag skulle nog påstå att den är väldigt komplett.
Vad sägs tex om:
Microsoft.Win32.Security.AceFlags.[b]INHERITED[/b]_ACE;
Microsoft.Win32.Security.DirectoryAccessType.FILE_[b]TRAVERSE[/b];
?
Det mesta (allt?) går nog att få rätt på via lite snokande och rätt mycket trial-and-error.
Upptäckte även att det fanns DirectoryAccessType mm, men jag kan inte komma på hur man använder det i koden :(
Det löste sig, man kunde sätta AceFlags också!
Hur blev då koden för det du ville göra? Jag frågar eftersom jag själv tycker det här med rättigheter är en djungel och det är bra att veta.