gpt4 book ai didi

c# - 使用模拟创建 Windows 文件夹

转载 作者:行者123 更新时间:2023-11-30 14:37:45 25 4
gpt4 key购买 nike

我正在尝试使用加密的 .config 文件提供的受限管理员帐户的凭据创建文件夹 - 现在我的代码在假设用户无权访问这些目录的情况下运行,因此抛出未经授权的异常,当获得访问权限时,代码可以正常工作,但我不能这样做,因为它会危及我们的安全。我已经知道如何从加密文件中获取我的用户名/密码,我只是不确定我应该使用什么库或语法来模拟;这是我的代码:

//set the cursor

string activeDir = "\\\\department\\shares\\users\\";

//create directory with userID as the folder name

string newPath = System.IO.Path.Combine(activeDir + userID);

System.IO.Directory.CreateDirectory(newPath);

所以我需要一种方法来提供凭据,但我不知所措 - 我一直在使用 System.DirectoryServices.AccountManagement 和 pricipalcontext 来提供用户名/密码以更改事件目录...我可以吗需要使用类似的库来更改文件系统?任何帮助将不胜感激,谢谢!

最佳答案

我认为您可以为执行此操作的线程暂时模拟该用户。似乎这只能通过 P/Invoke 来完成。看看this example .

using (var impersonation = new ImpersonatedUser(decryptedUser, decryptedDomain, decryptedPassword))
{
Directory.CreateDirectory(newPath);
}

为了完整起见(如果某天链接停止工作),请在下面找到 ImpersonatedUser 类(归功于 Jon Cole):

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Security.Principal;

public class ImpersonatedUser : IDisposable
{
IntPtr userHandle;

WindowsImpersonationContext impersonationContext;

public ImpersonatedUser(string user, string domain, string password)
{
userHandle = IntPtr.Zero;

bool loggedOn = LogonUser(
user,
domain,
password,
LogonType.Interactive,
LogonProvider.Default,
out userHandle);

if (!loggedOn)
throw new Win32Exception(Marshal.GetLastWin32Error());

// Begin impersonating the user
impersonationContext = WindowsIdentity.Impersonate(userHandle);
}

public void Dispose()
{
if (userHandle != IntPtr.Zero)
{
CloseHandle(userHandle);

userHandle = IntPtr.Zero;

impersonationContext.Undo();
}
}

[DllImport("advapi32.dll", SetLastError = true)]
static extern bool LogonUser(

string lpszUsername,

string lpszDomain,

string lpszPassword,

LogonType dwLogonType,

LogonProvider dwLogonProvider,

out IntPtr phToken

);

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool CloseHandle(IntPtr hHandle);

enum LogonType : int
{
Interactive = 2,
Network = 3,
Batch = 4,
Service = 5,
NetworkCleartext = 8,
NewCredentials = 9,
}

enum LogonProvider : int
{
Default = 0,
}

}

关于c# - 使用模拟创建 Windows 文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8901476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com