|
I have the following questions to ask about a C#.net 2008 desktop application that i want to modify by accessing the active directory values:
1. I am assuming the following code accesses the active directory and only keeps one active directory group value at a time. if not, can you tell me what is wrong with my assupmption.
a. The following code is the start call:
void InitBrowser()
{
CurrentUser = new TUser();
UserIs_Read = CurrentUser.HasTRole(TUser.TRole.Reader);
}
b. The following is the code it calls;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Principal;
namespace T.Common
{
public class TUser
{
public enum TRole
{
User = 0,
Manager = 1,
Administrator = 2,
Reader =3
}
public WindowsIdentity Identity;
public WindowsPrincipal Principal;
string _Domain;
public string Domain
{
get { return _Domain; }
}
string _Username;
public string Username
{
get { return _Username; }
}
public TUser()
{
this.Identity = WindowsIdentity.GetCurrent();
string[] NameInfo = this.Identity.Name.Split('\\');
_Domain = NameInfo[0];
_Username = NameInfo[1];
}
public bool HasTUser(TRole Role)
{
switch (Role)
{
case TRole.Reader:
return IsInGroup("Reader");
case Reader.Manager:
return IsInGroup("Managers");
//break;
case EnrollTracRole.Administrator:
return IsInGroup("Administrators");
//break;
case EnrollTracRole.User:
return true;
//break;
default:
return false;
}
}
public bool IsInGroup(string GroupName)
{
if (this.Principal == null)
{
this.Principal = new WindowsPrincipal(this.Identity);
}
return this.Principal.IsInRole(GroupName);
}
2. Would I somehow benefit from the code below instead of using the code I listed above? (the code below is just a small part of the active directory logic I would be using) If so, can you tell me how the following code is better:
private String[] ADSearch(String ConnectionString, String filter, String field){
DirectoryEntry SearchRoot =
new DirectoryEntry(ConnectionString, _userName, _pwd);
DirectorySearcher searcher =
new DirectorySearcher (SearchRoot, filter);
{
SearchRoot,
Filter = filter,
PageSize = 100
};
seararcher.PropertiesToLoad.Clear();
searcher.PropertiesToLoad.Add(field);
try
{
using (SearchResultCollection results = searcher.FindAll())
{
List<string> r = new List<string>();
foreach (SearchResult searchResult in results)
{
var prop = searchResult.Properties[field];
for (int index = 0; index < prop.Count; index++)
r.Add(prop[index].ToString());
}
return r.Count > 0 ? r.ToArray() : new string[0];
}
}
catch (Exception ex)
{
throw new ProviderException("Unable to query Active Directory.", ex);
}
}
public bool ValidateUser(string username, string password)
{
bool result = false;
try
{
using (var context =
new PrincipalContext(ContextType.Machine,_domain, null, _userName, _pwd))
{
result = context.ValidateCredentials(username, password);
}
}
catch (Exception ex)
{
/ TODO: log exception
}
return result;
}
|
|
|
|
|
Please format your code snippets with the "code block" option.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
I will do that the next time I enter any code. However, can you point me to a reference that shows me how to format the code so it is easier to read.
|
|
|
|
|
When you are entering a post, click the yellow-highlighted words right above the text box that say, "code block", then paste your code between the resultant tags.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
I'm using a simple form generated by VS 2010 which contains 2 buttons, start and stop.
Start triggers WH_MOUSE_LL using SetWindowsHookEx, and stop stops the hook.
The hook works fine and I mange to "replace" middle mouse button click with double click, the only problem I have is clicking on Minimize/Maximize/Close buttons of the form, it seems that there is some sort of "event race" between the hook and events called by buttons mentioned above. It reflects on the fact that when you press one of those buttons it keeps being "pressed" for a while before it completes it's action (e.g. form minimizes).
When I right click the form and select one of those actions it responds immediately same thing goes when I stop the hook and press one of the buttons mentioned above.
Have anyone encountered such behavior ?
|
|
|
|
|
I've not encountered this problem myself, but there are several excellent global mouse-hook examples here on CP[^], for instance: George Mamaladze's classic article, "Processing Global Mouse and Keyboard Hooks in C#"[^]. George first posted that article in 2004, and is still supporting it as of this year !
My guess is that you could post your question on one of the discussions of these mouse-hook technique articles, and get an answer.
best, Bill
"In the River of Delights, Panic has not failed me." Jorge Luis Borges
|
|
|
|
|
Hi,
I did not say that there was a problem with my hook,you can try to run George Mamaladze's hook and try clicking on form's control buttons Minimize/Maximize/Close and you'll see that it take time to it to respond ---> the same problem I had.
So now for the solution part:
Override windproc, when you receive message type "WM_NCLBUTTONDOWN" turn of the hook and return message to base this way your form regain control over the control event and there is no delay at all!
BTW you can detect which of the control's buttons was pressed if you check wParam of WM_NCLBUTTONDOWN message example: if wParam == HTMINBUTTON minimize was pressed.
Hope it can help someone.
-Alex
|
|
|
|
|
Hi Alex,
Glad you have a solution for your problem; if you really want to share what you've found in a way that CP will really benefit from it, may I suggest you post a comment on George Mamaladze's article describing what you've found: that article is very widely cited all over the internet, and still has active traffic.
best, Bill
"Is it a fact - or have I dreamt it - that, by means of electricity, the world of matter has become a great nerve, vibrating thousands of miles in a breathless point of time? Rather, the round globe is a vast head, a brain, instinct with intelligence!" - Nathanial Hawthorne, House of the Seven Gables
|
|
|
|
|
I am trying to create a program that reads the registry key for disabled start up programs and the issue i am having is that while i can read it in regedit, my program says that it is a null object.
string Path = @"SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg";
RegistryKey Run = Registry.LocalMachine;
Run = Run.OpenSubKey(Path, true);
string[] SubKeys = Run.GetSubKeyNames();
Can someone please point me in the right direction for the right permissions cuz I am getting confused with all the different ways to do the permissions. I have followed the microsoft site for it, but it still doesnt seem to help.
Thanks
|
|
|
|
|
How do you know it's a permission issue? I don't see a try/catch block around your code. Are you running this under the debugger to see what the exception is that's being thrown? My guess is that you're not.
".45 ACP - because shooting twice is just silly" - JSOP, 2010 ----- You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010 ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass." - Dale Earnhardt, 1997
|
|
|
|
|
There is a try catch, i didnt post the whole code cuz i didnt think it was important. the exception is null object reference. But i dont get why i could see it in the registry and copy the reg key, but not be able to access it in my program.
Here is the part of code:
try
{
string Path = @"SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg";
RegistryKey Run = Registry.LocalMachine;
Run = Run.OpenSubKey(Path, true);
string[] SubKeys = Run.GetSubKeyNames();
foreach (string SubKeys1 in SubKeys)
{
richTextBox1.Text += SubKeys1 + "/n";
}
}
catch (Exception ex)
{
richTextBox1.Text = ex.ToString();
}
Here is the exception:
System.NullReferenceException: Object reference not set to an instance of an object.
at RegTest.MainForm.RegTest() in f:\Programming\SharpDevelop\SharpDevelop Projects\RegTest\RegTest\MainForm.cs:line 41
modified on Monday, August 29, 2011 12:35 PM
|
|
|
|
|
If you had a problem with insufficient permissions then OpenSubKey should throw an exception saying so, I'm not even sure if you need write permission from the code you've posted but it doesn't matter.
So far as I can tell, the key your trying to open doesn't exist. When OpenSubKey can't find what you're looking for it returns null so it's something you should check for.
After a little digging, is seems that the key your after may not actually exist. If your running Vista/Win7 64-bit then I'm going to assume you can see the key you want to open. But if your building a 32-bit application the key your actually trying to open is HKLM\SOFTWARE\Wow6432Node\Microsoft\Shared Tools\MSConfig\startupreg , which if you go and look you'll find doesn't exist.
|
|
|
|
|
Make sure have sufficient privileges to read the registry,
Too much of heaven can bring you underground
Heaven can always turn around
Too much of heaven, our life is all hell bound
Heaven, the kill that makes no sound
|
|
|
|
|
Here is my new code:
try
{
string Path;
RegistryKey Run;
try
{
Path = @"SOFTWARE\Wow6432Node\Microsoft\Shared Tools\MSConfig";
Run = Registry.LocalMachine;
Run = Run.OpenSubKey(Path, true);
}
catch (Exception ex)
{
richTextBox1.Text = "Coulndt not find either Wow6432Node: \n" + ex.ToString();
}
Path = @"SOFTWARE\Microsoft\Shared Tools\MSConfig";
Run = Registry.LocalMachine;
Run = Run.OpenSubKey(Path, true);
string[] SubKeys = Run.GetSubKeyNames();
foreach (string SubKeys1 in SubKeys)
{
richTextBox1.Text += SubKeys1 + "\n";
}
}
catch (Exception ex)
{
richTextBox1.Text = "Coulndt not find either MSConfig: \n" + ex.ToString();
}
I am working on a 64bit system, and I do have the registry open to
SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg and I see keys in there.
I had to create a key for "SOFTWARE\Wow6432Node\Microsoft\Shared Tools\MSConfig\startupreg" and the program does work when i did that, but it doesnt store the keys i want in there. So i am having a heck of a time getting it to read the keys in the 32bit system
|
|
|
|
|
What information are you actually trying to get? Are you sure there's isn't an alternate way to get it?
|
|
|
|
|
I am trying to get the disabled startup programs. And if need be, write to it.
|
|
|
|
|
Well, I've come up with two solutions. The aim is to get access to the 64bit registry from a 32bit application (you'll have to check to make sure your running on x64 before trying to open the 64 bit version of the registry).
This Webpage[^] gives a few examples on how to do that. If you are already using (or are able to switch to) .Net 4 then its as simple as calling RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); otherwise your going to have to use the standard windows API because earlier versions of the framework don't support this functionality.
Once you make sure your working in the actual registry (rather than the 32bit mirror if your running on x64) you should be able to carry on as normal. Also I was checking this in a Virtual Machine and the MSConfig wasn't initially there because it had never been run, and I'd never disabled any startup applications so don't assume it will always be there.
|
|
|
|
|
Thanks you! it works like a dream now. I didnt think about accessing the registry as a 32 bit or 64 bit.
|
|
|
|
|
Hi,
I need to do a button which has same functionality as PTT (Press to Talk).
So, you press and keep the button pressed - it does some function.
On release of the button, do something else.
while (button.pressed)
do something
on release
do something
ps. I found this code in a Forum, but it is not working. Nothing happens on pressing the button.
///////////////////////////////////
isLooping = false;
//on mouse down
private void myControl_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) {
isLooping = true;
runLoop();
}
//on mouse up event
private void myControl_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) {
isLooping = false;
}
//This is the main loop you care about. Put this in your application
//This should go in its own thread
void runLoop() {
while (isLooping) {
//do stuff
}
}
|
|
|
|
|
asterix5 wrote: Nothing happens on pressing the button.
Because there is no code inside runLoop() method. Put your code inside the while loop.
|
|
|
|
|
Inside the loop, of course is something that I run. I use it to send Skype commands to turn off/on the microphone.
As I was looking, I tried to simplify it, so just dealing simply with the MouseDown and MouseUp events turning OFF/ON the mic.
Here below is the code, but still is not working - what should I execute on the Button Click itself?
_____________________________________________________________
private void button2_Click_1(object sender, EventArgs e)
{
}
public void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
Skype.Attach(6, true);
SKYPE4COMLib.Command command1 = new SKYPE4COMLib.Command();
command1.Command = "SET MUTE OFF";
command1.Blocking = false;
command1.Id = 1000;
Skype.SendCommand(command1);
}
//on mouse up event
private void OnMouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
Skype.Attach(6, true);
SKYPE4COMLib.Command command1 = new SKYPE4COMLib.Command();
command1.Command = "SET MUTE ON";
command1.Blocking = false;
command1.Id = 1000;
Skype.SendCommand(command1);
}
|
|
|
|
|
If I were you, I would log the events and actually see if they're executed or not.
Alternatively, the solution proposed by Wayne Gaylard is excellent. You may want to try that.
|
|
|
|
|
I would use a BackGroundWorker to handle the work while the button is pressed. I created a test app that adds the letter a to a textbox every second while the button is pressed, and stops when button is lifted. Here is the code for the form (assumes the form contains a button(button1) and a textbox(textBox1, with multiline set to true)). I am sure you can convert this to do what you require:
bool isPressed = false;
BackgroundWorker bgw = new BackgroundWorker();
public Form1()
{
InitializeComponent();
button1.MouseDown += new MouseEventHandler(button1_MouseDown);
button1.MouseUp += new MouseEventHandler(button1_MouseUp);
bgw.DoWork+=new DoWorkEventHandler(bgw_DoWork);
bgw.WorkerSupportsCancellation = true;
}
void bgw_DoWork(object sender, DoWorkEventArgs e)
{
while (isPressed)
{
DoWork();
Thread.Sleep(1000);
}
}
void button1_MouseUp(object sender, MouseEventArgs e)
{
bgw.CancelAsync();
isPressed = false;
}
void button1_MouseDown(object sender, MouseEventArgs e)
{
isPressed = true;
bgw.RunWorkerAsync();
}
delegate void doWork();
void DoWork()
{
if (this.InvokeRequired)
{
doWork d = new doWork(DoWork);
this.Invoke(d);
}
else
{
this.textBox1.Text += "a";
}
}
Hope this helps
Live for today. Plan for tomorrow. Party tonight!
|
|
|
|
|
EDIT: I have it solved, have found a similar library as that mine and there it is implemented in Java, so I just looked for a way to do it. It is needed to use tile-overlapping, so I modified my code and now it's working...
This is that page: http://www.jhlabs.com/[^]
Original message:
Hi all, does anybody know some good source to learn apply a fast convolution filter to image? I am looking for kernels with 20x20 an bigger and need to process image fast, so I need to learn how to do that using FFT or DFT.
I like to use GDI+ in C#.
Any suggestion?
Thanks in idvance...
modified on Tuesday, August 30, 2011 4:23 AM
|
|
|
|
|
Have you seen how does Matlab Function fft work?
Source Code available and may be useful...
Regards,
D
|
|
|
|
|