C#用WIN32·····

Deathsign 2008-06-05 08:20:13
[DllImport("advapi32s.dll")]
public static extern int LookupPrivilegevalue(
string lpSystemName, // system name
string lpName, // privilege name
IntPtr lpLuid // locally unique identifier out
);


为什么用这个函数的时候 他说找不到模块入口点
MSDN上说这个函数就是在advapi32s.dll的嘛··
高手解答下··
...全文
123 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Deathsign 2008-06-05
  • 打赏
  • 举报
回复
我试图打开的进程。。。openProcess 返回0.。。最高权限打开的··
Deathsign 2008-06-05
  • 打赏
  • 举报
回复
“currentProcess.ExitTime”引发了“System.ComponentModel.Win32Exception”类型的异常

这个是什么原因啊

Process.GetProcess得到的进程里面说的
不是系统进程

楼上的高人。。。怎么访问所有的进程呢

一些进程无法得到Process Handle
ericzhangbo1982111 2008-06-05
  • 打赏
  • 举报
回复

StructLayout(LayoutKind.Sequential)]
public struct LUID
{public int LowPart;public int HighPart;}

[StructLayout(LayoutKind.Sequential)]
public struct TOKEN_PRIVILEGES
{public LUID Luid;public int Attributes;public int PrivilegeCount;}


[DllImport("advapi32.dll", CharSet=CharSet.Auto)]
public static extern int OpenProcessToken(int ProcessHandle, int DesiredAccess, ref int tokenhandle);

[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
public static extern int GetCurrentProcess();

[DllImport("advapi32.dll", CharSet=CharSet.Auto)]public static extern int LookupPrivilegeValue(string lpsystemname, string lpname, [MarshalAs(UnmanagedType.Struct)] ref LUID lpLuid);

[DllImport("advapi32.dll", CharSet=CharSet.Auto)]
public static extern int AdjustTokenPrivileges(int tokenhandle, int disableprivs, [MarshalAs(UnmanagedType.Struct)]ref TOKEN_PRIVILEGES Newstate, int bufferlength, int PreivousState, int Returnlength);


[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern int RegLoadKey(uint hKey,string lpSubKey, string lpFile);

[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern int RegUnLoadKey(uint hKey, string lpSubKey);

public const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
public const int TOKEN_QUERY = 0x00000008;
public const int SE_PRIVILEGE_ENABLED = 0x00000002;
public const string SE_RESTORE_NAME = "SeRestorePrivilege";
public const string SE_BACKUP_NAME = "SeBackupPrivilege";
public const uint HKEY_USERS = 0x80000003;
public string shortname;
bool unloaded = false;



int token=0;
int retval=0;
TOKEN_PRIVILEGES TP = new TOKEN_PRIVILEGES();
TOKEN_PRIVILEGES TP2 = new TOKEN_PRIVILEGES();
LUID RestoreLuid = new LUID();
LUID BackupLuid = new LUID();
retval = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref token);retval = LookupPrivilegeValue(null, SE_RESTORE_NAME, ref RestoreLuid);

retval = LookupPrivilegeValue(null, SE_BACKUP_NAME, ref BackupLuid);
TP.PrivilegeCount = 1;
TP.Attributes = SE_PRIVILEGE_ENABLED;
TP.Luid = RestoreLuid;TP2.PrivilegeCount = 1;
TP2.Attributes = SE_PRIVILEGE_ENABLED;
TP2.Luid = BackupLuid;
retval = AdjustTokenPrivileges(token, 0, ref TP, 1024, 0, 0);
retval = AdjustTokenPrivileges(token, 0, ref TP2, 1024, 0, 0);
// Loading a Hive "C:\NTUSER.DAT"RegLoadKey(HKEY_USERS,"NTUSER.DAT",@"C:\NTUSER.DAT");)// Unloading a Hive "C:\NTUSER.DAT"RegUnLoadKey(HKEY_USERS,"NTUSER.DAT");
gisgeoboy 2008-06-05
  • 打赏
  • 举报
回复
[DllImport("advapi32s.dll", EntryPoint="LookupPrivilegevalueX")]
public static extern int LookupPrivilegevalue(
string lpSystemName, // system name
string lpName, // privilege name
IntPtr lpLuid // locally unique identifier out
);

Deathsign 2008-06-05
  • 打赏
  • 举报
回复
他报错误。。。找不到函数
ericzhangbo1982111 2008-06-05
  • 打赏
  • 举报
回复
GetCurrentProcessID 得到当前进程的ID
OpenProcessToken 得到进程的令牌句柄
LookupPrivilegeValue 查询进程的权限
AdjustTokenPrivileges 判断令牌权限

要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以 了。要是一个用户是Administrator或是被给予了相应的权限,就可以具有该权限。可是,就算我们用Administrator帐号对一个系统安 全进程执行OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)还是会遇到“访问拒绝”的错误。什么原因呢?原来在默认的情况下进程的一些访问权限是没有被使能(Enabled)的,所以我们 要做的首先是使能这些权限。与此相关的一些API函数有OpenProcessToken、LookupPrivilegevalue、 AdjustTokenPrivileges。我们要修改一个进程的访问令牌,首先要获得进程访问令牌的句柄,这可以通过 OpenProcessToken得到,函数的原型如下:

BOOL OpenProcessToken(
HANDLE ProcessHandle, //要修改访问权限的进程句柄
DWORD DesiredAccess, //指定你要进行的操作类型
PHANDLE TokenHandle //返回的访问令牌指针
);

第一参数是要修改访问权限的进程句柄;第三个参数就是返回的访问令牌指针;第二个参数指定你要进行的操作类型,如要修改令牌我们要指定第二个参数为 TOKEN_ADJUST_PRIVILEGES(其它一些参数可参考Platform SDK)。通过这个函数我们就可以得到当前进程的访问令牌的句柄(指定函数的第一个参数为GetCurrentProcess()就可以了)。接着我们可 以调用AdjustTokenPrivileges对这个访问令牌进行修改。AdjustTokenPrivileges的原型如下:

BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, // 访问令牌的句柄
BOOL DisableAllPrivileges, // 决定是进行权限修改还是除能(Disable)所有权限
PTOKEN_PRIVILEGES NewState, // 指明要修改的权限,是一个指向TOKEN_PRIVILEGES结构
的指针,该结构包含一个数组,数据组的每个项指明了权限
的类型和要进行的操作;
DWORD BufferLength, //结构PreviousState的长度,如果PreviousState为空,该参数
应为NULL
PTOKEN_PRIVILEGES PreviousState, // 指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问
权限的信息
PDWORD ReturnLength //实际PreviousState结构返回的大小
);

第一个参数是访问令牌的句柄;第二个参数决定是进行权限修改还是除能(Disable)所有权限;第三个参数指明要修改的权限,是一个指向 TOKEN_PRIVILEGES结构的指针,该结构包含一个数组,数据组的每个项指明了权限的类型和要进行的操作; 第四个参数是结构PreviousState的长度,如果PreviousState为空,该参数应为NULL;第五个参数也是一个指向 TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息,可空;最后一个参数为实际PreviousState结构返回的大小。在使用 这个函数前再看一下TOKEN_PRIVILEGES这个结构,其声明如下:

typedef struct _TOKEN_PRIVILEGES {
DWORD PrivilegeCount;
LUID_AND_ATTRIBUTES Privileges[];
}TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;

PrivilegeCount指的数组原素的个数,接着是一个LUID_AND_ATTRIBUTES类型的数组,再来看一下LUID_AND_ATTRIBUTES这个结构的内容,声明如下:

typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid;
DWORD Attributes;
}LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES

第二个参数就指明了我们要进行的操作类型,有三个可选项:

SE_PRIVILEGE_ENABLED
SE_PRIVILEGE_ENABLED_BY_DEFAULT
SE_PRIVILEGE_USED_FOR_ACCESS

要使能一个权限就指定Attributes为SE_PRIVILEGE_ENABLED。第一个参数就是指权限的类型,是一个LUID的值,LUID就是 指locally unique identifier,我想GUID大家是比较熟悉的,和GUID的要求保证全局唯一不同,LUID只要保证局部唯一,就是指在系统的每一次运行期间保证 是唯一的就可以了。另外和GUID相同的一点,LUID也是一个64位的值,相信大家都看过GUID那一大串的值,我们要怎么样才能知道一个权限对应的 LUID值是多少呢?这就要用到另外一个API函数LookupPrivilegevalue,其原形如下:

BOOL LookupPrivilegeValue(
LPCTSTR lpSystemName, //系统的名称,若为空,则在当前的sysytem查找。
LPCTSTR lpName, // 指明了权限的名称,如“SeDebugPrivilege”。
PLUID lpLuid // 返回LUID的指针
);

第一个参数是系统的名称,如果是本地系统只要指明为NULL就可以了,第三个参数就是返回LUID的指针,第二个参数就是指明了权限的名称,如“SeDebugPrivilege”。
  博图V16软件是一款由西门子出品的自动化编程软件,它是业内首个采用统一的工程组态和软件项目环境的自动化软件,几乎适用于所有自动化任务,借助该全新的工程技术软件平台,用户能够快速、直观地开发和调试自动化系统。   1、TIA Portal Multiuser Engineering   TIA允许多个用户同时工作在同一个项目上,增加协作的能力,另外还可以通过委托减少工作时间。   2、TIA Portal Teamcenter Gateway   Teamcenter网关让您保存和管理TIA Portal项目在Teamcenter。   3、TIA Portal Cloud Connector   允许客户通过工业私有云的形式,借助RDP协议接入远程PC的TIA管理器并可以连接现场硬件。   4、TIA User Management Component   TIA的用户管理组件(UMC)在TIA Portal V16提供全球用户管理的可选项。可以跨项目定义和管理用户和用户组。用户和用户组也可以从微软活动目录中获取。   5、TIA Portal Openness   SCL可以用XML来表示,意味着V16版本的LAD/FBD和SCL都相互导入导出为XML。   S7-1500标准PLC程序自动加载,在这种情况下,PLC的启动停止是隐形的,可以通过用户权限来控制。   系统UDT可以被用户数据类型访问。   SINAMICS G120 and SINAMICS S120 drives可以被V16版本的驱动组件来创建。   6、SIMATIC S7-PLCSIM Advanced   用co-simulation工具同步OB功能块的模拟。   支持RDREC/WRREC功能块和 alarms。   在TIA中配置过程报警可以支持API输出。   可以支持备份和恢复软硬件的配置。   允许PLCSIMPLCSIM Adv安装在同一台PC。   7、SIMATIC Visualization Architect   TIA V16完美支持虚拟化架构,可以与SiVarc结合在一起。   8、SIMATIC OPC UA S7-1500   OPC UA S7-1500选项允许任何第三方设备轻松连接到S7-1500通过集成在S7-1500 CPU的OPC UA服务器。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧