如何在Windows 7中获取当前登录的用户名(即物理登录到我正在启动的程序正在运行的控制台的用户).
例如,如果我以"MainUser"身份登录并运行我的控制台应用程序(将显示登录的用户名)作为"SubUser",则程序仅返回"SubUser"作为当前登录的用户.
我使用以下两种技术来获取用户名.两者都没有让我得到我想要的东西.
System.Environment.GetEnvironmentVariable("USERNAME")
System.Security.Principal.WindowsIdentity.GetCurrent().User;
Run Code Online (Sandbox Code Playgroud)
但请注意,无论运行此脚本的用户帐户如何,此VBScript代码都会返回登录的用户名:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set compsys_arr = objWMIService.ExecQuery _
("Select * from Win32_ComputerSystem")
For Each sys in compsys_arr
Wscript.Echo "username: " & sys.UserName
Next
Run Code Online (Sandbox Code Playgroud)
在C#中有什么可能吗?
如何将控制台应用程序设置为最顶层的窗口.我正在使用.NET构建控制台应用程序(我正在使用C#,甚至可以将pinvokes转换为非托管代码).
我以为我可以让我的控制台应用程序派生自Form类
class MyConsoleApp : Form {
public MyConsoleApp() {
this.TopLevel = true;
this.TopMost = true;
this.CenterToScreen();
}
public void DoSomething() {
//....
}
public static void Main() {
MyConsoleApp consoleApp = new MyConsoleApp();
consoleApp.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我不确定Windows窗体上设置的属性是否适用于控制台UI.
我正在使用C#(.NET 3.5)中的Environment.SetEnvironmentVariable方法调用,如下所示:
Environment.SetEnvironmentVariable(environmentVariable,value,"Machine");
但是,在单个测试系统(运行XP和Windows 7)上,这个单个调用需要2秒多的时间.我想通了,这可能是因为:"如果目标是用户或计算机,其他应用程序由Windows WM_SETTINGCHANGE消息通知的设置操作的." 有没有办法将此通知抑制到其他应用程序,以便我的环境快速设置并返回..?
请注意,我有一个组件可以设置大约20个环境变量,如果我使用上面描述的功能,则需要大约一分钟才能完成该任务.
请建议!!
我有一个32位perl安装程序.使用这个我需要能够安装和卸载32位和64位应用程序.
安装32位和64位很好.卸载32位也没关系.
但是,卸载64位应用程序时遇到问题.
应用程序只知道应用程序的名称,如控制面板中的添加删除程序中所示.例如,它可能是"Winzip 14.0",它是Winzip的显示名称.
我使用以下方法进行卸载:我遍历HKLM/Software/Microsoft/Windows/CurrentVersion/Uninstall并解析那里的密钥以查看Winzip是否匹配.如果是这样,我从那里得到卸载字符串.
my $register = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
$HKEY_LOCAL_MACHINE->Open($register,$hKey)|| die $!;
#Then parse all the nodes and fetch the uninstall string
Run Code Online (Sandbox Code Playgroud)
如果应用程序是64位安装,则卸载信息将驻留在HKLM/Software/Microsoft/Windows/CurrentVersion/Uninstall.
但是上面给出的perl安装程序代码试图从中读取
HKLM/Software/WOW6432Node/Microsoft/Windows/CurrentVersion/Uninstall
并且它没有在那里找到安装.
那么如何在32位进程中运行Perl代码来读取64位配置单元中的注册表值?我知道RegOpenKey()带KEY_WOW64_64KEY参数的API .但由于它是Windows API,我不知道这是否有帮助.即便如此,还有其他选择吗?
我被允许维护一些批处理文件,我在每个批处理文件的开头重复看到这一行.
FOR /f "usebackq tokens=*" %%a IN ('%0') DO SET this_cmds_dir=%%~dpa
CD /d "%this_cmds_dir%"
Run Code Online (Sandbox Code Playgroud)
有谁知道第一行是做什么的?什么是%% ~dpa?什么是%0?什么是usebackq?
如何使用 DataContractSerializer 序列化和反序列化多个对象?序列化很好,但是在反序列化期间我收到错误
“序列化操作失败。原因:反序列化 Serialization.Person 类型的对象时出错。有多个根元素。”
错误消息清楚地提到序列化文档没有根元素。但我该如何克服这个问题呢?
这是代码:
[DataContract]
class Person {
[DataMember(Name = "CustName")]
internal string Name;
public Person(string n) {Name = n;}
}
class Program {
public static void Main() {
WriteObject("d:\\temp\\DataContractExample.xml" , "Mary");
WriteObject("d:\\temp\\DataContractExample.xml", "Joe");
ReadObject("d:\\temp\\DataContractExample.xml");
}
public static void WriteObject(string path, string name) {
Person p1 = new Person(name);
FileStream fs = new FileStream(path, FileMode.Append);
XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs);
DataContractSerializer ser = new DataContractSerializer(typeof(Person));
ser.WriteObject(writer, p1);
writer.Close();
fs.Close();
}
public static void ReadObject(string path) {
FileStream …Run Code Online (Sandbox Code Playgroud) 我有一个C++客户端与C#服务器通信,我有用户定义类型的自定义序列化.
现在我需要将日期和时间结构从C++传递给C#.谷歌搜索导致以下方法:
为了测试水域,我在(本机)C++中写了两个片段,它们执行步骤1,2,3,另一个在C#中执行Step4.没有从C++到C#的自动调用.
我手动从第3步(130220830133980000L)中取出值并在C#中使用它,这里是代码片段和我得到的输出.
C++代码
SYSTEMTIME st;
GetSystemTime(&st);
printf("\n In C++ : %04d:%02d:%02d:%02d:%02d:%02d:%03d\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
FILETIME fileTime;
if(!SystemTimeToFileTime(&st, &fileTime)) {
wcout << "Conversion from system time to file time failed. Error : " << GetLastError();
}
__int64 ticks = (((ULONGLONG) fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime;
Run Code Online (Sandbox Code Playgroud)
C#代码
DateTime dob = new DateTime(130220830133980000L, DateTimeKind.Utc);
Console.WriteLine("In C# : " + dob.Year + ":" + dob.Month + ":" + dob.Day + ":" + dob.Hour + …Run Code Online (Sandbox Code Playgroud) 在我们的项目(使用.NET完全开发)中,我们使用大小约为2 GB的中型数据库.目前我们正在使用SQL Express版本;
SQL Server Express的替代方案如何执行?我主要考虑的是MySQL和PostgreSQL.(Windows 7 x86,x64)
是否值得考虑这些替代方案,特别是考虑到我们是.NET商店的事实?
我已经提到了这些相关的问题:
我有一个Perl应用程序,它使用open和print调用将日志写入文件.
open (FH, "d:\\temp.txt");
print FH "Some log";
close (FH);
Run Code Online (Sandbox Code Playgroud)
但是,在机器突然关闭期间,日志不会持久保存到文件中.因此,在几个地方搜索之后,建议使用两个选项来执行无缓冲的IO(即将文本写入磁盘而不是将其保存在缓存中然后将其刷新):
我已经尝试了这两个选项,它只是不起作用.在异常关闭之前我做的任何写操作都会丢失.
有什么方法可以在Perl中几乎确定地完成无缓冲的IO?我使用Perl 5.8.3运行Windows 7 64位.
编辑:我搜索了如何让Windows执行无缓冲的IO,这是如何做到的!呼叫
有人可以帮助Perl的Win32 API进行这3次调用.