適切な権限を持つASP.NET / C#でサービスを開始します
-
07-09-2020 - |
質問
私のウェブサイト(ASP.NET/C#で書かれています)モデレーターは特定のサービスを開始できるようにします。私が持っているコードは次のとおりです。
ServiceController svcController = new ServiceController("InvidualFileConversion");
if (svcController != null)
{
try
{
svcController.Stop();
svcController.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10));
svcController.Start();
}
catch (Exception ex)
{
// error
}
}
.
今これを実行すると、追加のメッセージが表示され、「ACCESが拒否されている」というメッセージが表示されます。
これが権限に関する問題であることを知っていますが、どのように私は自分自身に適切な権限を与えるのですか? 私が書くべき答えに来ないでください:、私はそれを試してみました、そしてそれはうまくいきませんでした。また、これらの数列のコード行のためにそれを必要とするときに、これをウェブサイト全体で設定するための最善の方法ではないと思います。
編集:私はこれを私のコードで追加しました、それでもうまくいかない、私は同じ場所で同じ例外を得ます。今、それはこのようなものです:
protected void ConvertLink_OnClick(object sender, EventArgs e)
{
//convert();
try
{
//--need to impersonate with the user having appropriate rights to start the service
Impersonate objImpersonate = new Impersonate(domainName, userName, userPassword);
if (objImpersonate.impersonateValidUser())
{
//--write code to start/stop the window service
startWindowsService();
objImpersonate.undoImpersonation();
}
}
catch (Exception Ex)
{ Response.Write(Ex.Message + Ex.InnerException.Message); }
}
private void startWindowsService()
{
ServiceController svcController = new ServiceController("InvidualFileConversion");
if (svcController != null)
{
try
{
svcController.Stop();
svcController.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(10));
svcController.Start();
}
catch (Exception ex)
{
// error
}
}
}
.
私はこのようなスポンジ化クラスを持っています:
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Generic;
using System.Security.Principal;
using System.Runtime.InteropServices;
/// <summary>
/// Summary description for Impersonate
/// </summary>
public class Impersonate
{
#region "Class Members"
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
WindowsImpersonationContext impersonationContext;
#endregion
#region "Class Properties"
public string domainName { get; set; }
public string userName { get; set; }
public string userPassword { get; set; }
#endregion
public Impersonate()
{
//
// TODO: Add constructor logic here
//
}
public Impersonate(string domainName, string userName, string userPassword)
{
this.domainName = domainName;
this.userName = userName;
this.userPassword = userPassword;
}
#region "Impersonation Code"
[DllImport("advapi32.dll")]
public static extern int LogonUserA(String lpszUserName,
String lpszDomain,
String lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int DuplicateToken(IntPtr hToken,
int impersonationLevel,
ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool RevertToSelf();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);
public bool impersonateValidUser()
{
WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if (RevertToSelf())
{
if (LogonUserA(this.userName, this.domainName, this.userPassword, LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT, ref token) != 0)
{
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
{
tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
impersonationContext = tempWindowsIdentity.Impersonate();
if (impersonationContext != null)
{
CloseHandle(token);
CloseHandle(tokenDuplicate);
return true;
}
}
}
}
if (token != IntPtr.Zero)
CloseHandle(token);
if (tokenDuplicate != IntPtr.Zero)
CloseHandle(tokenDuplicate);
return false;
}
public void undoImpersonation()
{
impersonationContext.Undo();
}
#endregion
}
.
それでは、検証のことはうまくいきますが、私の問題を解決しません。私はその権限に関する問題があると思います。
編集2:次のステップはこれを含みます:
- IDがユーザーに設定されているアプリプールを作成する(管理者グループのメンバーです)。
- Service "Logon"を同じユーザーに設定します。
- Webアプリを再度実行した後はまだ失敗しました。
しかし私が管理者アカウントをコード内の資格情報として置くと、それは機能します。 / P>
それでも、私は管理者アカウントで欲しいものを手に入れることができますが、私が自分を作成したアカウントではなく、管理権限を持っています。私はそれがあなたの管理者資格情報を利用可能にすることがそれほど安全ではないと思うように私自身を作ったユーザーでこの作品を作りたいです。
SideNoteでは、私が操作するサーバ上で、管理者権限を持つが「管理者」アカウントではありません。
編集3:これは奇妙になっています。私は今働いているようですが: - 偽装方法なし(それはうまくいきませんでした)。 - Robが言ったのはただ述べました。私が定義したユーザーを持つ私自身のアプリケーションプールがあります。 Windowsサービスには、そのユーザーも指定されています。 (ユーザーはサービス権としてログオンしたログオン) - これで、うまくいっているようです。 - しかし、私のウェブサイトを介してデバッグした場合、私はまだ拒否されました。しかし、ブラウザを通して私のウェブサイトとそのIPを介してアクセスするだけで、私はサービスを開始することができます。
を合計するには: - 偽装方法は機能しません。 - サービスにユーザーが指定されている場合は、現在のユーザーを使用して自己作成したアプリプールを使用するだけです。しかし、それはデバッグモードでは機能しません(まだACCESがそこで拒否されました)。
この投稿は大きくなり、それでもそれを読むかどうかは疑問に思っています。しかし、それでも誰かが私に詳細を提供することができますか?将来どこかに失敗するのが怖いです。
コメントは鑑賞されます! フロリス
解決
あなたのWebサイトがサービスを開始するのに十分な権限を持っているユーザーの下で実行されていることを確認する必要があります。 匿名認証がIISで無効になっていることを確認してください。 良い方法は、サーバーWeb上でサービスを開始する権限を持つユーザーを作成することで、そのユーザーの下で実行されるアプリケーションプールを作成することです。Webサイトをそのアプリケーションプールを使用してください。このアプローチを使用すると、すべてのWebサイトが作成したばかりのユーザーの下で実行されます。 もっと粒状になる場合は、サービスを開始する権限を持つユーザーを作成することができますが、アプリケーションプールに使用するのではなく、そのユーザーの下で実行を開始する必要があるページだけを、偽装を使用して実行することができます。この方法でのみ、負荷機能機能を使用できます。
以下のリンクを見てください。
href="http://forums.asp.net/t/1137962.asp/1" REL="ASP.not/t/1137962.asp / 1 < / a>