|
Hi there,
I've googled and searched the discussion groups to try to get a listing of companies that sell user security applications that I can bolt onto an existing application that I have built and I can't seem to find anything. Don't know if I'm searhing for the wrong terms or no one has built anything for this purpose.
Anyone know of products that allow you to bolt on things like a login, form/ field/table level security for a C# windows application?
Thanks
|
|
|
|
|
jaydel123 wrote: Anyone know of products that allow you to bolt on things like a login, form/ field/table level security for a C# windows application?
Aladdin[^] springs to mind, but there are more solutions. I'm curious about what gets recommended by others
I are Troll
|
|
|
|
|
Hi there, thanks for the reply except that alladin is for SaaS applications and not windows (winforms) applications. I want to be able to give the user the application and one of the forms is a user maintenance form that will add and remove users to the application I have built. In the backend it is either creating a windows authenticated user or a SQL authenticated user with an encypted password. Then you tell the security application what forms the user can access and it's very easy to make security application access calls to see what forms the users should be able to open.
I'm talking more about once the software is licensed on the users system how to control access to the application with users and groups.
Thanks
|
|
|
|
|
Hi all,
Is there a straight forward way to remove leading zeros from a negative string:
ex. -00002 -> -2
Thanks.
|
|
|
|
|
Depends on what you're trying to do, but you can always use Integer.Parse or Integer.TryParse to convert it to an int, then just format it however you want with .ToString.
|
|
|
|
|
That worked great. Is there an easy way that I can see how much processing time the parsing is adding to the loop?
|
|
|
|
|
Do the processing without the parsing a bunch of times, take the average time. Compare that to the average time of doing the processing with the parsing.
|
|
|
|
|
|
sounds like you want a regex, replacing a minus and zero or more zeroes, by a minus sign.
|
|
|
|
|
Or repeatedly replace "-0" with "-" until there are none.
Or make substrings of the first character and all the rest, left trim the zeroes from the second part, and concatenate.
|
|
|
|
|
Have you tried
Convert.ToInt32(-00002);
This might get you rid of everything, even though the input is a negative number.
- jaypatel512
|
|
|
|
|
<rant>DON'T USE THE CONVERT CLASS!!!</rant>
Pretty much all it does is call the appropriate xxx.Parse method anyway, so if you know what class it is, just call its Parse method, Int32.Parse , as was already mentioned.
The only reasonable member of Convert is ChangeType .
|
|
|
|
|
|
Only when it's available.
Or, if you want the Exception to be thrown. Why avoid the Exception if you're just going to throw your own anyway?
|
|
|
|
|
PIEBALDconsult wrote: Only when it's available. thats what i said (if the method is there...)
Now why would you even consider raising/throwing an exception, thats just bad pratice. never use exception for you code-flow.
An exception should only be thrown, when it truly is an exception, like if your transfer data over the net and the cord gets unplugged, thats an exception.
Parsing data that is not correct, is not an exception.
Lets say in this case, you want to parse -002 to -2, and the value begin parsed, turns out to be "-002$" then its not an exception, then the value ("you should know"), you want to parse is incorrect, handle it. thats to correct way, I believe.
Furthermore, I believe the code engine will spin down for every exception it has to handle.
Just a short comparison:
for 1000 parsings
Parse: 4078 milliseconds
Try Parse: 0 milliseconds
I used this code to test:
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
try { int demo = int.Parse("x"); }
catch (Exception) {}
}
sw.Stop();
Debug.WriteLine("Parse: " + sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int i = 0; i < 1000; i++)
{
int demo;
int.TryParse("x", out demo);
}
sw.Stop();
Debug.WriteLine("Try Parse: " + sw.ElapsedMilliseconds);
With great code, comes great complexity, so keep it simple stupid...
|
|
|
|
|
Paw Jershauge wrote: thats just bad pratice
Only at the application level, not at the framework level.
|
|
|
|
|
Also on framework level, Microsoft contradicts its self sometimes in the framework, but hey I dont always follow my own guidelines either.
- If you know the Error, of why the code fails, handle it.
- Only handle exceptions you can recover from.
- If you dont know why the exception was thrown, its better to let the framework kill your app. According to microsoft.
But then again others think you should clean up what you can, and then exiting the orderly fashion.
With great code, comes great complexity, so keep it simple stupid...
|
|
|
|
|
Paw Jershauge wrote: why the code fails, handle it.
Some times you want to handle it by exiting.
Paw Jershauge wrote: you can recover from
Correct.
Paw Jershauge wrote: its better to let the framework kill your app
Yes, quite often, but that's up to the application, not any underlying code.
But keep in mind that I write mostly console/batch programs and Windows Services.
|
|
|
|
|
Paw Jershauge wrote: Try Parse: 0 milliseconds
You don't find that a little suspicious? I expect the whole for loop got optimized away, I've had that happen before. Try summing up the values and print the sum after the loop to ensure that it doesn't it doesn't get optimized.
Paw Jershauge wrote: catch (Exception) {}
I certainly didn't suggest that.
Paw Jershauge wrote: int.Parse("x");
That's just silly.
|
|
|
|
|
PIEBALDconsult wrote: You don't find that a little suspicious? I expect the whole for loop got optimized away, I've had that happen before. Try summing up the values and print the sum after the loop to ensure that it doesn't it doesn't get optimized.
Actualy you might be right about the optimizing, but the fact is that the code is an will be faster running TryParse.
PIEBALDconsult wrote: Paw Jershauge wrote:
catch (Exception) {}
I certainly didn't suggest that.
i didn't say you did. this was only a very very short demo test.
PIEBALDconsult wrote: Paw Jershauge wrote:
int.Parse("x");
That's just silly.
No not really, as my p.o.i. was to fail anyway.
Stopwatch sw = new Stopwatch();
int ParseOutPut = 0;
sw.Start();
for (int i = 0; i < 1000; i++)
{
try
{
int demo = 0;
if(i % 3 == 0)
demo = int.Parse("x");
else
demo = int.Parse("1" + i.ToString());
ParseOutPut += demo;
}
catch (Exception) { }
}
sw.Stop();
Debug.WriteLine("Parse [" + ParseOutPut + "]: " + sw.ElapsedMilliseconds);
sw.Reset();
int TryParseOutPut = 0;
sw.Start();
for (int i = 0; i < 1000; i++)
{
int demo;
if(i % 3 == 0)
int.TryParse("x", out demo);
else
int.TryParse("1" + i.ToString(), out demo);
TryParseOutPut += demo;
}
sw.Stop();
Debug.WriteLine("Try Parse [" + TryParseOutPut + "]: " + sw.ElapsedMilliseconds);
Returns on my computer:
Parse [938727]: 1464 ms
Try Parse [938727]: 0 ms
With great code, comes great complexity, so keep it simple stupid...
|
|
|
|
|
Parse: 16016 500000000
Try Parse: 15440 500000000
About a four percent saving, big deal, it's not about performance anyway.
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch() ;
int demo = 0 ;
sw.Start() ;
for ( int i = 0 ; i < 100000000 ; i++ )
{
demo += int.Parse ( args [ 0 ] ) ;
}
sw.Stop() ;
System.Console.WriteLine ( "Parse: {0} {1}" , sw.ElapsedMilliseconds , demo ) ;
demo = 0 ;
sw.Reset() ;
sw.Start() ;
for ( int i = 0 ; i < 100000000 ; i++ )
{
int temp ;
int.TryParse ( args [ 0 ] , out temp ) ;
demo += temp ;
}
sw.Stop() ;
System.Console.WriteLine ( "Try Parse: {0} {1}" , sw.ElapsedMilliseconds , demo ) ;
|
|
|
|
|
Its all about performance, your code here assumes that everything is ok. so its not valid test.
With great code, comes great complexity, so keep it simple stupid...
|
|
|
|
|
If it fails, I want to throw and terminate.
|
|
|
|
|
I have a little issue and I know you will say that you always make sure the threads close. The problem I have is I spawn 3 threads to check for various information using WMI. The one thread that pulls applications can be time consuming and there really isn't a function to tell WMI to stop once it has started...
So a user selects a computer and tells it to open, when the other form for that specifc computer opens it begins pulling information. Basically I want the user to be able to close the form even if it is not finished. But I don't want it to cause the application to fail or they get a popup just because the thread couldn't write to the handle.
There has to be a way. I mean Windows does it. If you launch a application in debug mode and that application is running multiple threads, then you go to visual studio and tell it to stop debugging everythign quits with no errors!
I am creating the thread like this:
appThread = new Thread(new ThreadStart(GetApplications));
appThread.IsBackground = true;
appThread.Start();
GetApplications:
private void GetApplications()
{
WMI_Commands wmi = new WMI_Commands(Username, Password,
System.Management.ImpersonationLevel.Impersonate, System.Management.AuthenticationLevel.Default);
List<Product> products = wmi.InstalledApplications(NetBios);
foreach (Product p in products)
{
AddApplication(p);
}
products = null;
SetPBVisible("pbapplications", false);
}
|
|
|
|
|
Some times you just have to abort a thread.
|
|
|
|