webForumDet fria alternativet

DOS Prompt

.NETur .NET

36 svar · 1 164 visningar · startad av aleborg

Medlem sedan jan. 20013 341 inlägg
Frågan#1

Jag vill köra ett kommando via dosprompten från ett program i C#, någon som vet hur man gör detta?

Medlem sedan maj 20021 466 inlägg
#2

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.

Medlem sedan jan. 20013 341 inlägg
#3

men hur gör man det via C#?
jag ska köra ett kommando direkt i från koden...

Medlem sedan juni 20022 599 inlägg
#4

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

Medlem sedan jan. 20013 341 inlägg
#5

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...

Medlem sedan juni 20022 599 inlägg
#6

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.

Medlem sedan jan. 20013 341 inlägg
#7

Japp det menar jag, tack :)
Du vet inget bättre sätt att ändra fil/mapp rättigheter på?

Medlem sedan juni 20022 599 inlägg
#8

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.

Medlem sedan jan. 20013 341 inlägg
#9

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

Medlem sedan juni 20022 599 inlägg
#10

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?

Medlem sedan jan. 20013 341 inlägg
#11

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

Medlem sedan jan. 20013 341 inlägg
#12

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"?

Medlem sedan juni 20022 599 inlägg
#13

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".

Medlem sedan jan. 20013 341 inlägg
#14

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

Medlem sedan juni 20022 599 inlägg
#15

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 ..

Medlem sedan jan. 20013 341 inlägg
#16

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 :(

Medlem sedan juni 20022 599 inlägg
#17

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.

Medlem sedan jan. 20013 341 inlägg
#18

Upptäckte även att det fanns DirectoryAccessType mm, men jag kan inte komma på hur man använder det i koden :(

Medlem sedan jan. 20013 341 inlägg
#19

Det löste sig, man kunde sätta AceFlags också!

Medlem sedan juni 20022 599 inlägg
#20

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.

137 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)