|
By the way I already have the Nikon SDK and it is horrible. Has not been update since 2004.
|
|
|
|
|
Yeah, well I've used the Canon SDK and it was easier to get that kind of stuff using that than trying to figure out WIA's generic for everything way to do it.
|
|
|
|
|
Dave, thank for your replies.
I got it to work using C# and WIA. Here is the code.
private void BatteryWIAStatus()
{
if (camera != null)
{
camera.ExecuteCommand(WIA.CommandID.wiaCommandSynchronize);
try
{
foreach (WIA.Property i in camera.Properties)
{
if (i.Name == "Battery Status")
{
string bStat = i.get_Value().ToString();
lblBattery.Text = "Battery " + bStat + "%";
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error has occurred!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
I put the Synchronize command in to update the status as it appears the battery status is cached. Still testing that part.
|
|
|
|
|
Hello All,
I want to find the query for Total Mail Box Size in Exchange Server 2007. I have implemented this earlier in Exchange Server 2003 with WMI using following Query. select Size from Exchange_Mailbox where Size >= 0. I have googled for it and saw lot of scripts, But I hope I can implement it in a single line query like this using powershell. Can someone shed some light for an easier solution?
Thanks in advance...
Regards
Sebastian
|
|
|
|
|
Sorry, there is no single query. You have to enumerate through the folders of the mailbox and get the total size for each, then add them all up.
|
|
|
|
|
I have this base class:
public abstract class _ViewModelBase : ViewModelBase
{
public _ViewModelBase()
{
RegisterMessaging();
SetupViewModel();
}
protected abstract void RegisterMessaging();
protected abstract void SetupViewModel();
}
It is subclassed into
public abstract class _DataViewModelBase : _ViewModelBase
{
public _EntityBase DataEntity { get; set; }
public _DataViewModelBase(_EntityBase Entity)
: base()
{
DataEntity = Entity;
}
}
In _DataViewModelBase how do I store the DataEntity parameter value to the DataEntity field before :base is called?
Everything makes sense in someone's mind
|
|
|
|
|
It doesn't make sense what you are asking. Also none of these constructors will be called anyway as the classes are both abstract.
You could change the constructors accessor to protected so the code can be executed but there is still no assurance the inheriting class will even call the constructor.
To do what you want, refactor the ViewModelBase constructor code into another protected method called say Init() and then call that method instead of base().
public _DataViewModelBase(_EntityBase Entity)
{
DataEntity = Entity;
base.Init();
}
BTW: prefixing classes with underscore is considered bad form by some developers.
"You get that on the big jobs."
|
|
|
|
|
RobCroll wrote: It doesn't make sense what you are asking. Also none of these constructors will be called anyway as the classes are both abstract.
Say what with the who now? What about derived classes calling the constructor as demonstrated in this very question?
Or, to illustate with a basic example
public abstract class MyAbstractClass
{
public MyAbstractClass()
{
}
}
public class MyConcreteClass : MyAbstractClass
{
public MyConcreteClass()
: base()
{
}
}
|
|
|
|
|
Personally, i would be asking why I wanted to do this.
I assume that the SetupViewModel method requires the DataEntity property to be set.
What, immediately becomes apparent is that you have a method, whose body is declared in the subclass, acting on data, declared in the subclass after all logic in the base class constructor has been performed .. Is it really necessary to have SetupViewModel as an abstract in the base as it is entirely specific to the subclass?
If you need to ensure setup functionality has occurred before other logic in the base class is run you could consider a protected _isInitialized boolean field alongside the abstract SetupViewModel method. Then check _isInitialized before performing logic and if it is false, call SetupViewModel (which, since the subclass constructor will have run by this point, will be able to access DataEntity )
An alternative is to consider whether all subclasses would ahve a common base for their data entity, in which case the base class could have a field of this type (or a collection of this type) and the field could be passed into the base constructor.
A further alternative is to make _ViewModelBase generic (_ViewModelBase<t> ) with a DataEntity of type T and, again, pass this to the base class
Pedis ex oris
Quidquid latine dictum sit, altum sonatur
|
|
|
|
|
You can't. Very annoying it is too, in certain circumstances. (Particularly if the constructor calls some virtual methods, in which case DataEntity won't be available in those either.) In a simple case like this (where a view model wants to store a 'something') I'd make _ViewModelBase (that underscore makes me feel ill, by the way) generic and have it store the data object in its constructor.
|
|
|
|
|
Hi,
I think I have become a little lost while trying to pass values from one class to another and, having researched reasons why my code isn't working, am now going in circles (I really need to start documenting attempted methods).
OK, so I have this code which gets some user details using impersonation (thanks to Luc for making me work harder finding an answer)
public class UInfo
{
[DllImport("advapi32", SetLastError=true), SuppressUnmanagedCodeSecurityAttribute]
static extern int OpenProcessToken(System.IntPtr ProcessHandle, int DesiredAccess, ref IntPtr TokenHandle);
[DllImport("kernel32", SetLastError=true), SuppressUnmanagedCodeSecurityAttribute]
static extern bool CloseHandle(IntPtr handle);
[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
public const int TOKEN_DUPLICATE = 2;
public const int TOKEN_QUERY = 0X00000008;
public const int TOKEN_IMPERSONATE = 0X00000004;
public void UsInfo(string[] args)
{
IntPtr hToken = IntPtr.Zero;
IntPtr dupeTokenHandle = IntPtr.Zero;
Process proc = Process.GetProcessById(2568);
if
{
OpenProcessToken(proc.Handle,TOKEN_QUERY|TOKEN_IMPERSONATE|TOKEN_DUPLICATE, ref hToken) != 0)
{
WindowsIdentity newId = new WindowsIdentity(hToken);
try
{
const int SecurityImpersonation = 2;
dupeTokenHandle = DupeToken(hToken,
SecurityImpersonation);
if(IntPtr.Zero == dupeTokenHandle)
{
string s = String.Format("Dup failed {0},
privilege not held",
Marshal.GetLastWin32Error());
throw new Exception(s);
}
WindowsImpersonationContext impersonatedUser =
newId.Impersonate();
IntPtr accountToken =
WindowsIdentity.GetCurrent().Token;
string Token = accountToken.ToString();
string WinID =
WindowsIdentity.GetCurrent().Name;
string IsAuthd =
newId.IsAuthenticated.ToString();
string AuthType = newId.AuthenticationType;
string IsGuest = newId.IsGuest.ToString();
string SIDNo = newId.Owner.ToString();
string SIDPlain =
newId.Owner.TranslatTAccount)).ToString());
}
finally
{
CloseHandle(hToken);
}
}
else
{
string s = String.Format("OpenProcess Failed {0},
privilege not held", Marshal.GetLastWin32Error());
throw new Exception(s);
}
}
static IntPtr DupeToken(IntPtr token, int Level)
{
IntPtr dupeTokenHandle = IntPtr.Zero;
bool retVal = DuplicateToken(token, Level, ref
dupeTokenHandle);
return dupeTokenHandle;
}
}
but I need to put the string values retrieved in to my service's code:-
public partial class Service : ServiceBase
{
public void OnTimedEvent(object source, ElapsedEventArgs e)
{
in.Parameters.Add("@UAuthType", SqlDbType.NVarChar,40)
.Value = AuthType;
in.Parameters.Add("@UAuth", SqlDbType.NVarChar, 40)
.Value = IsAuthd;
I have tried using public const string AuthType = ""; but still nothing writes to the db.
Could someone please point me in the right direction on this? I have seen a lot of articles using this kind of thing from http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/02d7555b-b600-4b0e-aa76-6b2d976e6c44/
public class Customer
{
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
}
but surely there has to be a more concise way to return multiple values?
Thanks for your time.
|
|
|
|
|
CCodeNewbie wrote: ;
Where are you instantiating an instance of the Uinfo class?
Why is common sense not common?
Never argue with an idiot. They will drag you down to their level where they are an expert.
Sometimes it takes a lot of work to be lazy
Individuality is fine, as long as we do it together - F. Burns
|
|
|
|
|
Hi Wes, nice to meet you.
I am not sure I understand your question (but then I am almost a complete newbie at c#).
Do you where I am creating or invoking the the instance? Sorry if its a dumb question.
If I may add, (as I can be fairly idiotic sometimes) the saying goes "Never argue with an idiot. They will drag you down to their level and beat you on experience"
|
|
|
|
|
CCodeNewbie wrote: where I am creating
Right. I do not see anywhere in your code block where you instantiate your class (Uinfo ui = new Uinfo() ) Such as:
public partial class Service : ServiceBase
{
public void OnTimedEvent(object source, ElapsedEventArgs e)
{
Uinfo ui = new Uinfo();
in.Parameters.Add("@UAuthType", SqlDbType.NVarChar,40)
.Value = ui.AuthType;
in.Parameters.Add("@UAuth", SqlDbType.NVarChar, 40)
.Value = IsAuthd;
Or am I missing something? Of course this method relies on modifying Uinfo to use properties.
Why is common sense not common?
Never argue with an idiot. They will drag you down to their level where they are an expert.
Sometimes it takes a lot of work to be lazy
Individuality is fine, as long as we do it together - F. Burns
|
|
|
|
|
I had tried exactly that (well, close enough I had used Uinfo userinfo) but when I do
in.Parameters.Add("@UAuthType", SqlDbType.NVarChar,40).Value = I only get the options of
DuplicateToken
Equals
ReferenceEquals
TOKEN_DUPLICATE
TOKEN_IMPERSONATE
TOKEN_QUERY
???
|
|
|
|
|
I see. Well the problem is that in your UsInfo method, you are assigning the results to local variables. You need to make them properties or fields so that you can retrieve them externally.
|
|
|
|
|
Whoosh, right over my head.
I think know what you mean though thus I had tried declaring public const strings and contemplating get;set;.
What would you suggest?
|
|
|
|
|
CCodeNewbie wrote: What would you suggest?
First thing is study up on scope.
Then in your Uinfo class use properties. Like:
public string AuthType {get;set;}
Then assign it inside your Uinfo class
AuthType = "some string"
To use it for your database then you need to instantiate your class and then you can use the property
string dbparameter = ui.AuthType
Why is common sense not common?
Never argue with an idiot. They will drag you down to their level where they are an expert.
Sometimes it takes a lot of work to be lazy
Individuality is fine, as long as we do it together - F. Burns
|
|
|
|
|
CCodeNewbie wrote: What would you suggest?
Pretty much what Wes has to say. I'm not sure you need to create properties for it - as you aren't manipulating anything there, just leaving it as a field would be enough.
|
|
|
|
|
Hi Pete,
Please pardon my ignorance/incompetence but I'm still not getting it. If I follow suggestions and use
public string LogonUser { get; set;}
I get the compile errors
'Uinfo.LogonUser.get' must declare a body because it is not marked abstract or extern
'Uinfo.LogonUser.set' must declare a body because it is not marked abstract or extern
OK, so I go
public string LogonUser { get { return LogonUser; } set { LogonUser = value; } }
and get 'An unhandled exception of type 'System.StackOverflowException' occurred in whatever.exe'. I think this may be because LogonUser is Null.
If I do this
public string LogonUser;
then in Main() I get
"from main" with no value for ui.LogonUser.
I am probably missing something really simple but can't seem to grasp what it is.
Code follows:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Principal;
using System.Text;
namespace Something
{
public class whatever
{
public static void Main()
{
UInfo ui = new UInfo();
Console.WriteLine("from main" + ui.LogonUser);
Console.ReadLine();
}
}
public class UInfo
{
[DllImport("advapi32", SetLastError = true), SuppressUnmanagedCodeSecurityAttribute]
static extern int OpenProcessToken(System.IntPtr ProcessHandle, int DesiredAccess, ref IntPtr TokenHandle);
[DllImport("kernel32", SetLastError = true), SuppressUnmanagedCodeSecurityAttribute]
static extern bool CloseHandle(IntPtr handle);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
public const int TOKEN_DUPLICATE = 2;
public const int TOKEN_QUERY = 0X00000008;
public const int TOKEN_IMPERSONATE = 0X00000004;
public string LogonUser;
public static void Uinfo()
{
IntPtr hToken = IntPtr.Zero;
IntPtr dupeTokenHandle = IntPtr.Zero;
int p = Process.GetProcessesByName("explorer")[0].Id;
Process r = Process.GetProcessById(p);
if (OpenProcessToken(r.Handle, TOKEN_QUERY | TOKEN_IMPERSONATE | TOKEN_DUPLICATE, ref hToken) != 0)
{
WindowsIdentity newId = new WindowsIdentity(hToken);
try
{
const int SecurityImpersonation = 2;
dupeTokenHandle = DupeToken(hToken, SecurityImpersonation);
if (IntPtr.Zero == dupeTokenHandle)
{
string s = String.Format("Dup failed {0}, privilege not held",
Marshal.GetLastWin32Error());
throw new Exception(s);
}
WindowsImpersonationContext impersonatedUser = newId.Impersonate();
IntPtr accountToken = WindowsIdentity.GetCurrent().Token;
string LogonUser = WindowsIdentity.GetCurrent().Name;
}
finally
{
CloseHandle(hToken);
}
}
else
{
string s = String.Format("OpenProcess Failed {0}, privilege not held", Marshal.GetLastWin32Error());
throw new Exception(s);
}
}
}
static IntPtr DupeToken(IntPtr token, int Level)
{
IntPtr dupeTokenHandle = IntPtr.Zero;
bool retVal = DuplicateToken(token, Level, ref dupeTokenHandle);
return dupeTokenHandle;
}
}
Could you tell me what I missed in the tutorials please?
|
|
|
|
|
You seem to be missing a lot of code here. I would expect to see code to actually write to the database. Merely setting parameters doesn't do anything. I also don't see any use of your UInfo class in there. Could you post the missing bits please? Without them, we can't really offer more help.
|
|
|
|
|
Hi Pete,
Good to "see" you again. The sql connection code goes
using (SqlConnection UserInfo = new SqlConnection("User id = xxx; password = yyy; server=aaa\\bbb;" +
"database=mydb;connection timeout=30"))
{
SqlCommand in = new SqlCommand("INSERT INTO dbo.ccc(Tstamp, SysID, LogOnUser, DefUser," + "AltDefUser, UAuthType, UAuth, UGuest, USIDNo, USIDPlain, UToken)" +
"VALUES (@Tstamp, @SysID, @LogOnUser, @DefUser,"
+ "@AltDefUser, @UAuthType, @UAuth, @UGuest, @USIDNo, @USIDPlain, @UToken)", UserInfo);
I can assure you the the SQL part of it works 100% because a) if I use static values (e.g. AuthType = "a") then that values writes to the db and b) if I do
[DllImport("advapi32", SetLastError = true), SuppressUnmanagedCodeSecurityAttribute]
static extern int OpenProcessToken(System.IntPtr ProcessHandle, int DesiredAccess, ref IntPtr TokenHandle);
[DllImport("kernel32", SetLastError = true), SuppressUnmanagedCodeSecurityAttribute]
static extern bool CloseHandle(IntPtr handle);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
public const int TOKEN_DUPLICATE = 2;
public const int TOKEN_QUERY = 0X00000008;
public const int TOKEN_IMPERSONATE = 0X00000004;
public void OnTimedEvent(object source, ElapsedEventArgs e)
{
IntPtr hToken = IntPtr.Zero;
IntPtr dupeTokenHandle = IntPtr.Zero;
Process proc = Process.GetProcessById(2568);
if (OpenProcessToken(proc.Handle,TOKEN_QUERY|TOKEN_IMPERSONATE|TOKEN_DUPLICATE, ref hToken) != 0)
{
WindowsIdentity newId = new WindowsIdentity(hToken);
try
{
const int SecurityImpersonation = 2;
dupeTokenHandle = DupeToken(hToken, SecurityImpersonation);
if(IntPtr.Zero == dupeTokenHandle)
{
string s = String.Format("Dup failed {0}, privilege not held",
Marshal.GetLastWin32Error());
throw new Exception(s);
}
WindowsImpersonationContext impersonatedUser =
newId.Impersonate();
IntPtr accountToken = WindowsIdentity.GetCurrent().Token;
RegistryKey RegKeyDU = Registry.LocalMachine;
in.Parameters.Add("@UAuthType", SqlDbType.NVarChar, 40).Value = AuthType;
UserInfo.Open();
inu.ExecuteNonQuery();
UserInfo.Close();
}
}
finally
{
CloseHandle(hToken);
}
}
else
{
string s = String.Format("OpenProcess Failed {0}, privilege not
held", Marshal.GetLastWin32Error());
throw new Exception(s);
}
}
Then the data writes properly, i.e. If I incorporate the method into the exising class everything works as it should...
|
|
|
|
|
Sorry, got to go to bed . Been up 18 hrs now -eyes tired, brain tired. Look forward to talking more tomorrow.
Thanks for you input so far...
|
|
|
|
|
When you want to return multiple values, create a data class, with either properties or fields in it. I tend to just make them fields because properties don't gain you anything in this case (the purpose of the class is to expose all its data anyway). In this case you want to put all these things
string Token = accountToken.ToString();
string WinID =
WindowsIdentity.GetCurrent().Name;
string IsAuthd =
newId.IsAuthenticated.ToString();
string AuthType = newId.AuthenticationType;
string IsGuest = newId.IsGuest.ToString();
string SIDNo = newId.Owner.ToString();
string SIDPlain =
newId.Owner.TranslatTAccount)).ToString());
... in a data class (possibly UInfo itself) as public fields.
|
|
|
|
|
BobJanova wrote: I tend to just make them fields because properties don't gain you anything in
this case
Personally, I never expose fields, only properties. In many cases there is no gain, but it provides the flexibility to perform validation or make read only etc in the future. There is very little work required to create the properties and is much more maintainable IMHO.
|
|
|
|
|