小编San*_*osh的帖子

在C#中获取登录的用户名

如何在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#中有什么可能吗?

c# login

9
推荐指数
2
解决办法
1万
查看次数

如何将控制台应用程序窗口设置为最顶层的窗口(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# window console-application

8
推荐指数
1
解决办法
8698
查看次数

Environment.SetEnvironmentVariable需要很长时间才能在用户或计算机级别设置变量

我正在使用C#(.NET 3.5)中的Environment.SetEnvironmentVariable方法调用,如下所示:

Environment.SetEnvironmentVariable(environmentVariable,value,"Machine");

但是,在单个测试系统(运行XP和Windows 7)上,这个单个调用需要2秒多的时间.我想通了,这可能是因为:"如果目标是用户或计算机,其他应用程序由Windows WM_SETTINGCHANGE消息通知的设置操作的." 有没有办法将此通知抑制到其他应用程序,以便我的环境快速设置并返回..?

请注意,我有一个组件可以设置大约20个环境变量,如果我使用上面描述的功能,则需要大约一分钟才能完成该任务.

请建议!!

c# environment-variables

7
推荐指数
1
解决办法
2530
查看次数

如何使32位Perl读取64位Windows注册表?

我有一个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,我不知道这是否有帮助.即便如此,还有其他选择吗?

windows registry perl 64-bit

6
推荐指数
1
解决办法
4447
查看次数

在IL中的空引用上调用实例方法

在IL中的空引用上调用实例方法是否正确?有没有任何例子可以证明这一点..?

c# null cil

6
推荐指数
2
解决办法
979
查看次数

%% ~dpa的含义?

我被允许维护一些批处理文件,我在每个批处理文件的开头重复看到这一行.

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?

cmd batch-file

6
推荐指数
2
解决办法
2万
查看次数

使用 DataContractSerializer 序列化和反序列化多个对象

如何使用 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# serialization datacontractserializer

4
推荐指数
1
解决办法
6361
查看次数

将SYSTEMTIME(Native C++)转换为DateTime(C#)

我有一个C++客户端与C#服务器通信,我有用户定义类型的自定义序列化.

现在我需要将日期和时间结构从C++传递给C#.谷歌搜索导致以下方法:

  1. 填写SYSTEMTIME结构中的日期/时间(这不是当前系统时间.而是基于某些条件由程序填写)
  2. 将SYSTEMTIME转换为FILETIME
  3. 将FILETIME转换为__int64(这给出了一个64位值,表示从1601年1月1日开始的100纳秒间隔的数量)
  4. 在构造函数中将此64位值用于C#中的DateTime.

为了测试水域,我在(本机)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)

c# c++ datetime

4
推荐指数
1
解决办法
6087
查看次数

SQL Server Express替代方案超出2GB限制

在我们的项目(使用.NET完全开发)中,我们使用大小约为2 GB的中型数据库.目前我们正在使用SQL Express版本;

SQL Server Express的替代方案如何执行?我主要考虑的是MySQL和PostgreSQL.(Windows 7 x86,x64)

  • 使用MySQL或PostgreSQL有任何令人信服的优势吗?
  • 本机.NET对象支持怎么样?
  • 内置XML类型?
  • 支持二进制数据?
  • 支持像Management Studio这样的类似工具?
  • 安装方便吗?
  • 内存占用?
  • 这3个数据库的性能比较?

是否值得考虑这些替代方案,特别是考虑到我们是.NET商店的事实?

我已经提到了这些相关的问题:

mysql database postgresql sql-server-express

3
推荐指数
1
解决办法
3289
查看次数

perl中的无缓冲IO

我有一个Perl应用程序,它使用open和print调用将日志写入文件.

open (FH, "d:\\temp.txt");
print FH "Some log";
close (FH);
Run Code Online (Sandbox Code Playgroud)

但是,在机器突然关闭期间,日志不会持久保存到文件中.因此,在几个地方搜索之后,建议使用两个选项来执行无缓冲的IO(即将文本写入磁盘而不是将其保存在缓存中然后将其刷新):

  1. sysopen,syswrite
  2. $ | = 1;

我已经尝试了这两个选项,它只是不起作用.在异常关闭之前我做的任何写操作都会丢失.

有什么方法可以在Perl中几乎确定地完成无缓冲的IO?我使用Perl 5.8.3运行Windows 7 64位.

编辑:我搜索了如何让Windows执行无缓冲的IO,这是如何做到的!呼叫

  1. 的CreateFile与FILE_FLAG_NO_BUFFERING dwFlagAndAttributes可以.但是,这需要考虑内存对齐问题(即文件访问缓冲区应该是扇区对齐的;应用程序通过调用GetDiskFreeSpace来确定扇区大小)
  2. 使用WriteFile将数据写入文件.这个写入是无缓冲的,而不是去缓存,它直接进入磁盘.
  3. 最后,调用FlushFileBuffers来刷新与文件关联的元数据.

有人可以帮助Perl的Win32 API进行这3次调用.

windows io perl unbuffered

3
推荐指数
1
解决办法
1999
查看次数